首页 > 代码库 > 使用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 还提供了自定义的登录及退出方式,大家可以根据实际情况,自己操作。

总之,有了这个认证管理器后,服务器的安全性进一步加强。

另外也可以利用这个,实现当前客户端的访问情况。