首页 > 代码库 > 使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器
使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器
从kbmmw 4.4 开始,增加了认证管理器,这个比原来的简单认证提供了更多的功能。细化了很多权限操作。
今天对这一块做个介绍。
要做一个认证管理,大概分为以下5步:
1. 定义你要保护的资源,一般是服务、函数,当然你只要不限麻烦,可以是任何东西;
2. 定义使用者(用户);
3. 定义角色,使用者通过角色与服务器打交道;
4. 定义角色或用户可以访问的资源(授权);
5. 定义认证与登录的限制(本步不是必须的)。
一般来说,用户是通过配置文件或数据库来保存的,这样可以灵活的设置用户名与密码,当然也包括用户的角色。
我们以以前的数据服务为例,做一个认证管理。(本例子工作环境:win7 x64+delphi xe6+kbmmw 4.5 beta1)
首先,在主窗体放一个kbmMWAuthorizationManager1。
如图
为了方便,设置mwaoautologin. 这样在客户端直接使用客户端的用户名与密码登录。
另外kbmmwserver1 要应用这个认证管理器
同时在注册完服务器后,按上面的步骤定义资源及角色等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | sd:= kbmMWServer1 . RegisterServicebyname( ‘xaliondatasrv‘ ,Tquerysrv , false ); editorrole:=kbmMWAuthorizationManager1 . AddRole( ‘Editor‘ ); // 定义一个编辑角色 readerrole:=kbmMWAuthorizationManager1 . AddRole( ‘Reader‘ ); //定义一个读者角色 adminrole:=kbmMWAuthorizationManager1 . AddRole( ‘Administrator‘ ); //定义一个超级用户角色 adminrole . SubRoles . Add(readerrole); // 超级用户 具有编辑与读者的功能 adminrole . SubRoles . Add(editorrole); // 编辑与读者 是超级用户的子角色 kbmMWAuthorizationManager1 . AddActor( ‘xalion‘ , ‘xalion‘ , ‘Reader‘ ); // 定义两个用户 kbmMWAuthorizationManager1 . AddActor( ‘yh‘ , ‘yh‘ , ‘Administrator‘ ); // 这个可以通过数据库来存储 readerResources:=kbmMWAuthorizationManager1 . AddResource( ‘ReaderResources‘ ); // 定义两个资源 editorResources:=kbmMWAuthorizationManager1 . AddResource( ‘EditorResources‘ ); kbmMWAuthorizationManager1 . AddResource( ‘xaliondatasrv.QUERY‘ ,readerResources); // 定义资源权限 kbmMWAuthorizationManager1 . AddResource( ‘xaliondatasrv.DEFINITIONS‘ ,readerResources); kbmMWAuthorizationManager1 . AddResource( ‘xaliondatasrv.EXECUTE‘ ,readerResources); kbmMWAuthorizationManager1 . AddResource( ‘xaliondatasrv.INVENTORY‘ ,readerResources); kbmMWAuthorizationManager1 . AddResource( ‘xaliondatasrv.METADATA‘ ,readerResources); kbmMWAuthorizationManager1 . AddResource( ‘xaliondatasrv.RESOLVE‘ ,editorResources); kbmMWAuthorizationManager1 . Grant( ‘‘ , ‘Reader‘ , ‘ReaderResources‘ ,[mwapExecute]); // 给角色授权 kbmMWAuthorizationManager1 . Grant( ‘‘ , ‘Editor‘ , ‘EditorResources‘ ,[mwapExecute]); |
最后把数据服务设为需要认证才能访问。
1 2 3 4 5 6 7 8 9 10 | {$IFNDEF CPP}class{$ENDIF} function Tquerysrv . GetPrefServiceName: string ; begin Result:= ‘xaliondatasrv‘ ; end ; {$IFNDEF CPP}class{$ENDIF} function Tquerysrv . GetFlags:TkbmMWServiceFlags; begin Result:=[mwsfListed,mwsfRunRequireAuth]; end ; |
服务器端就设置好了。
可以运行,并启动服务。
如果客户端没有加入认证用户名的话,查询就会出错。
表示,由于没有认证,无法访问服务器资源。
因此我们需要在客户端加入用户信息。
在查询时输入用户名及密码
1 2 3 4 5 6 7 8 9 | procedure TForm2 . Button6Click(Sender: TObject); begin kbmMWSimpleClient1 . Username:= ‘xalion‘ ; kbmMWSimpleClient1 . Password:= ‘xalion‘ ; cx . query . Clear; cx . Query . Add( ‘sp_tables‘ ); cx . Open; end |
现在运行客户端,就可以正常访问了
继续修改表的内容后,然后reslove, 由于前面的角色没权限,就会出认证错误
现在只能使用有编辑权限的用户了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | procedure TForm2 . Button6Click(Sender: TObject); begin kbmMWSimpleClient1 . Username:= ‘yh‘ ; kbmMWSimpleClient1 . Password:= ‘yh‘ ; cx . query . Clear; cx . Query . Add( ‘select * from test‘ ); cx . Open; end ; procedure TForm2 . Button7Click(Sender: TObject); begin cx . Resolve; showmessage( ‘修改成功‘ ); end ; |
这样就没问题了。
基本上就完成了认证管理。
如果想了解认证的过程,可以在
里面设置一下,就可以显示一下的认证过程。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | GetAuthorization: Attempt authorization for : Actor=YH , Role=ADMINISTRATOR, Resource=XALIONDATASRV . RESOLVE GetAuthorization: Attempt authorization for : Actor=<all>, Role=ADMINISTRATOR, Resource=XALIONDATASRV . RESOLVE GetAuthorization: Attempt authorization for : Actor=YH , Role=<all>, Resource=XALIONDATASRV . RESOLVE GetAuthorization: Attempt authorization for : Actor=<all>, Role=<all>, Resource=XALIONDATASRV . RESOLVE GetAuthorization: Attempt authorization for : Actor=YH , Role=ADMINISTRATOR, Resource=EDITORRESOURCES GetAuthorization: Attempt authorization for : Actor=<all>, Role=ADMINISTRATOR, Resource=EDITORRESOURCES GetAuthorization: Attempt authorization for : Actor=YH , Role=<all>, Resource=EDITORRESOURCES GetAuthorization: Attempt authorization for : Actor=<all>, Role=<all>, Resource=EDITORRESOURCES GetAuthorization: Attempting subrole authorization for : Actor=YH , Role=ADMINISTRATOR, Resource=XALIONDATASRV . RESOLVE GetAuthorization: Attempt authorization for : Actor=YH , Role=READER, Resource=XALIONDATASRV . RESOLVE GetAuthorization: Attempt authorization for : Actor=<all>, Role=READER, Resource=XALIONDATASRV . RESOLVE GetAuthorization: Attempt authorization for : Actor=YH , Role=<all>, Resource=XALIONDATASRV . RESOLVE GetAuthorization: Attempt authorization for : Actor=<all>, Role=<all>, Resource=XALIONDATASRV . RESOLVE GetAuthorization: Attempt authorization for : Actor=YH , Role=READER, Resource=EDITORRESOURCES GetAuthorization: Attempt authorization for : Actor=<all>, Role=READER, Resource=EDITORRESOURCES GetAuthorization: Attempt authorization for : Actor=YH , Role=<all>, Resource=EDITORRESOURCES GetAuthorization: Attempt authorization for : Actor=<all>, Role=<all>, Resource=EDITORRESOURCES GetAuthorization: Unauthorized Actor=YH, Role=READER, Resource=xaliondatasrv . RESOLVE GetAuthorization: Attempt authorization for : Actor=YH , Role=EDITOR, Resource=XALIONDATASRV . RESOLVE GetAuthorization: Attempt authorization for : Actor=<all>, Role=EDITOR, Resource=XALIONDATASRV . RESOLVE GetAuthorization: Attempt authorization for : Actor=YH , Role=<all>, Resource=XALIONDATASRV . RESOLVE GetAuthorization: Attempt authorization for : Actor=<all>, Role=<all>, Resource=XALIONDATASRV . RESOLVE GetAuthorization: Attempt authorization for : Actor=YH , Role=EDITOR, Resource=EDITORRESOURCES GetAuthorization: Attempt authorization for : Actor=<all>, Role=EDITOR, Resource=EDITORRESOURCES |
kbmmw 还提供了自定义的登录及退出方式,大家可以根据实际情况,自己操作。
总之,有了这个认证管理器后,服务器的安全性进一步加强。
另外也可以利用这个,实现当前客户端的访问情况。