使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器
? 從kbmmw 4.4 開始,增加了認(rèn)證管理器,這個比原來的簡單認(rèn)證提供了更多的功能。細(xì)化了很多權(quán)限操作。
今天對這一塊做個介紹。
? 要做一個認(rèn)證管理,大概分為以下5步:
?????? 1.? 定義你要保護(hù)的資源,一般是服務(wù)、函數(shù),當(dāng)然你只要不限麻煩,可以是任何東西;
?????? 2.? 定義使用者(用戶);
?????? 3.? 定義角色,使用者通過角色與服務(wù)器打交道;
?????? 4.? 定義角色或用戶可以訪問的資源(授權(quán));
?????? 5. 定義認(rèn)證與登錄的限制(本步不是必須的)。
一般來說,用戶是通過配置文件或數(shù)據(jù)庫來保存的,這樣可以靈活的設(shè)置用戶名與密碼,當(dāng)然也包括用戶的角色。
? 我們以以前的數(shù)據(jù)服務(wù)為例,做一個認(rèn)證管理。(本例子工作環(huán)境:win7 x64+delphi xe6+kbmmw 4.5 beta1)
首先,在主窗體放一個kbmMWAuthorizationManager1。
如圖
為了方便,設(shè)置mwaoautologin. 這樣在客戶端直接使用客戶端的用戶名與密碼登錄。
另外kbmmwserver1 要應(yīng)用這個認(rèn)證管理器
同時在注冊完服務(wù)器后,按上面的步驟定義資源及角色等。
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'); // 這個可以通過數(shù)據(jù)庫來存儲readerResources:=kbmMWAuthorizationManager1.AddResource('ReaderResources'); // 定義兩個資源editorResources:=kbmMWAuthorizationManager1.AddResource('EditorResources');kbmMWAuthorizationManager1.AddResource('xaliondatasrv.QUERY',readerResources); // 定義資源權(quán)限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]); // 給角色授權(quán)kbmMWAuthorizationManager1.Grant('','Editor','EditorResources',[mwapExecute]);?
最后把數(shù)據(jù)服務(wù)設(shè)為需要認(rèn)證才能訪問。
{$IFNDEF CPP}class{$ENDIF} function Tquerysrv.GetPrefServiceName:string; beginResult:='xaliondatasrv'; end;{$IFNDEF CPP}class{$ENDIF} function Tquerysrv.GetFlags:TkbmMWServiceFlags; beginResult:=[mwsfListed,mwsfRunRequireAuth]; end;?
服務(wù)器端就設(shè)置好了。
可以運(yùn)行,并啟動服務(wù)。
如果客戶端沒有加入認(rèn)證用戶名的話,查詢就會出錯。
表示,由于沒有認(rèn)證,無法訪問服務(wù)器資源。
因此我們需要在客戶端加入用戶信息。
?
在查詢時輸入用戶名及密碼
procedure TForm2.Button6Click(Sender: TObject); beginkbmMWSimpleClient1.Username:='xalion';kbmMWSimpleClient1.Password:='xalion';cx.query.Clear;cx.Query.Add('sp_tables');cx.Open; end?現(xiàn)在運(yùn)行客戶端,就可以正常訪問了
?
?
繼續(xù)修改表的內(nèi)容后,然后reslove, 由于前面的角色沒權(quán)限,就會出認(rèn)證錯誤
?
現(xiàn)在只能使用有編輯權(quán)限的用戶了。
?
procedure TForm2.Button6Click(Sender: TObject); beginkbmMWSimpleClient1.Username:='yh';kbmMWSimpleClient1.Password:='yh';cx.query.Clear;cx.Query.Add('select * from test');cx.Open; end;procedure TForm2.Button7Click(Sender: TObject); begincx.Resolve;showmessage('修改成功'); end;?這樣就沒問題了。
基本上就完成了認(rèn)證管理。
?
如果想了解認(rèn)證的過程,可以在
里面設(shè)置一下,就可以顯示一下的認(rèn)證過程。
?
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 還提供了自定義的登錄及退出方式,大家可以根據(jù)實際情況,自己操作。
總之,有了這個認(rèn)證管理器后,服務(wù)器的安全性進(jìn)一步加強(qiáng)。
另外也可以利用這個,實現(xiàn)當(dāng)前客戶端的訪問情況。
轉(zhuǎn)載于:https://www.cnblogs.com/xalion/p/3738603.html
總結(jié)
以上是生活随笔為你收集整理的使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android之在view中内嵌浏览器的
- 下一篇: B-树特征