从kbmmw 4.4 开始,增加了认证管理器,这个比原来的简单认证提供了更多的功能。细化了很多权限操作。
今天对这一块做个介绍。
要做一个认证管理,大概分为以下5步:
1. 定义你要保护的资源,一般是服务、函数,当然你只要不限麻烦,可以是任何东西;
2. 定义使用者(用户);
3. 定义角色,使用者通过角色与服务器打交道;
4. 定义角色或用户可以访问的资源(授权);
5. 定义认证与登录的限制(本步不是必须的)。
一般来说,用户是通过配置文件或数据库来保存的,这样可以灵活的设置用户名与密码,当然也包括用户的角色。
我们以以前的数据服务为例,做一个认证管理。(本例子工作环境:win7 x64+delphi xe6+kbmmw 4.5 beta1)
首先,在主窗体放一个kbmMWAuthorizationManager1。
如图
为了方便,设置mwaoautologin. 这样在客户端直接使用客户端的用户名与密码登录。
另外kbmmwserver1 要应用这个认证管理器
同时在注册完服务器后,按上面的步骤定义资源及角色等。
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]);
最后把数据服务设为需要认证才能访问。
{$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;
服务器端就设置好了。
可以运行,并启动服务。
如果客户端没有加入认证用户名的话,查询就会出错。
表示,由于没有认证,无法访问服务器资源。
因此我们需要在客户端加入用户信息。
在查询时输入用户名及密码
procedure TForm2.Button6Click(Sender: TObject); begin kbmMWSimpleClient1.Username:='xalion'; kbmMWSimpleClient1.Password:='xalion'; cx.query.Clear; cx.Query.Add('sp_tables'); cx.Open; end
现在运行客户端,就可以正常访问了
继续修改表的内容后,然后reslove, 由于前面的角色没权限,就会出认证错误
现在只能使用有编辑权限的用户了。
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;
这样就没问题了。
基本上就完成了认证管理。
如果想了解认证的过程,可以在
里面设置一下,就可以显示一下的认证过程。
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 还提供了自定义的登录及退出方式,大家可以根据实际情况,自己操作。
总之,有了这个认证管理器后,服务器的安全性进一步加强。
另外也可以利用这个,实现当前客户端的访问情况。