從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
<code>sd:= kbmMWServer1</code><code>.</code><code>RegisterServicebyname(</code><code>‘xaliondatasrv‘</code><code>,Tquerysrv ,</code><code>false</code><code>);</code>
<code> </code><code>editorrole:=kbmMWAuthorizationManager1</code><code>.</code><code>AddRole(</code><code>‘Editor‘</code><code>); </code><code>// 定義一個編輯角色</code>
<code> </code><code>readerrole:=kbmMWAuthorizationManager1</code><code>.</code><code>AddRole(</code><code>‘Reader‘</code><code>); </code><code>//定義一個讀者角色</code>
<code> </code><code>adminrole:=kbmMWAuthorizationManager1</code><code>.</code><code>AddRole(</code><code>‘Administrator‘</code><code>);</code><code>//定義一個超級使用者角色</code>
<code> </code><code>adminrole</code><code>.</code><code>SubRoles</code><code>.</code><code>Add(readerrole); </code><code>// 超級使用者 具有編輯與讀者的功能</code>
<code> </code><code>adminrole</code><code>.</code><code>SubRoles</code><code>.</code><code>Add(editorrole); </code><code>// 編輯與讀者 是超級使用者的子角色</code>
<code> </code><code>kbmMWAuthorizationManager1</code><code>.</code><code>AddActor(</code><code>‘xalion‘</code><code>,</code><code>‘xalion‘</code><code>,</code><code>‘Reader‘</code><code>); </code><code>// 定義兩個使用者</code>
<code> </code><code>kbmMWAuthorizationManager1</code><code>.</code><code>AddActor(</code><code>‘yh‘</code><code>,</code><code>‘yh‘</code><code>,</code><code>‘Administrator‘</code><code>);</code><code>// 這個可以通過資料庫來存儲</code>
<code> </code><code>readerResources:=kbmMWAuthorizationManager1</code><code>.</code><code>AddResource(</code><code>‘ReaderResources‘</code><code>);</code><code>// 定義兩個資源</code>
<code> </code><code>editorResources:=kbmMWAuthorizationManager1</code><code>.</code><code>AddResource(</code><code>‘EditorResources‘</code><code>);</code>
<code> </code><code>kbmMWAuthorizationManager1</code><code>.</code><code>AddResource(</code><code>‘xaliondatasrv.QUERY‘</code><code>,readerResources);</code><code>// 定義資源權限</code>
<code> </code><code>kbmMWAuthorizationManager1</code><code>.</code><code>AddResource(</code><code>‘xaliondatasrv.DEFINITIONS‘</code><code>,readerResources);</code>
<code> </code><code>kbmMWAuthorizationManager1</code><code>.</code><code>AddResource(</code><code>‘xaliondatasrv.EXECUTE‘</code><code>,readerResources);</code>
<code> </code><code>kbmMWAuthorizationManager1</code><code>.</code><code>AddResource(</code><code>‘xaliondatasrv.INVENTORY‘</code><code>,readerResources);</code>
<code> </code><code>kbmMWAuthorizationManager1</code><code>.</code><code>AddResource(</code><code>‘xaliondatasrv.METADATA‘</code><code>,readerResources);</code>
<code> </code><code>kbmMWAuthorizationManager1</code><code>.</code><code>AddResource(</code><code>‘xaliondatasrv.RESOLVE‘</code><code>,editorResources);</code>
<code> </code><code>kbmMWAuthorizationManager1</code><code>.</code><code>Grant(</code><code>‘‘</code><code>,</code><code>‘Reader‘</code><code>,</code><code>‘ReaderResources‘</code><code>,[mwapExecute]);</code><code>// 給角色授權</code>
<code> </code><code>kbmMWAuthorizationManager1</code><code>.</code><code>Grant(</code><code>‘‘</code><code>,</code><code>‘Editor‘</code><code>,</code><code>‘EditorResources‘</code><code>,[mwapExecute]);</code>
最後把資料服務設為需要認證才能通路。
<code>{$IFNDEF CPP}class{$ENDIF}</code>
<code>function</code> <code>Tquerysrv</code><code>.</code><code>GetPrefServiceName:</code><code>string</code><code>;</code>
<code>begin</code>
<code> </code><code>Result:=</code><code>‘xaliondatasrv‘</code><code>;</code>
<code>end</code><code>;</code>
<code>function</code> <code>Tquerysrv</code><code>.</code><code>GetFlags:TkbmMWServiceFlags;</code>
<code> </code>
<code> </code><code>Result:=[mwsfListed,mwsfRunRequireAuth];</code>
伺服器端就設定好了。
可以運作,并啟動服務。
如果用戶端沒有加入認證使用者名的話,查詢就會出錯。
表示,由于沒有認證,無法通路伺服器資源。
是以我們需要在用戶端加入使用者資訊。
在查詢時輸入使用者名及密碼
<code>procedure</code>
<code>TForm2</code><code>.</code><code>Button6Click(Sender: TObject);</code>
<code> </code><code>kbmMWSimpleClient1</code><code>.</code><code>Username:=</code><code>‘xalion‘</code><code>;</code>
<code> </code><code>kbmMWSimpleClient1</code><code>.</code><code>Password:=</code><code>‘xalion‘</code><code>;</code>
<code> </code><code>cx</code><code>.</code><code>query</code><code>.</code><code>Clear;</code>
<code> </code><code>cx</code><code>.</code><code>Query</code><code>.</code><code>Add(</code><code>‘sp_tables‘</code><code>);</code>
<code> </code><code>cx</code><code>.</code><code>Open;</code>
<code>end</code>
現在運作用戶端,就可以正常通路了
繼續修改表的内容後,然後reslove, 由于前面的角色沒權限,就會出認證錯誤
現在隻能使用有編輯權限的使用者了。
<code> </code><code>kbmMWSimpleClient1</code><code>.</code><code>Username:=</code><code>‘yh‘</code><code>;</code>
<code> </code><code>kbmMWSimpleClient1</code><code>.</code><code>Password:=</code><code>‘yh‘</code><code>;</code>
<code> </code><code>cx</code><code>.</code><code>Query</code><code>.</code><code>Add(</code><code>‘select * from test‘</code><code>);</code>
<code>TForm2</code><code>.</code><code>Button7Click(Sender: TObject);</code>
<code> </code><code>cx</code><code>.</code><code>Resolve;</code>
<code> </code><code>showmessage(</code><code>‘修改成功‘</code><code>);</code>
這樣就沒問題了。
基本上就完成了認證管理。
如果想了解認證的過程,可以在
裡面設定一下,就可以顯示一下的認證過程。
<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=YH , Role=ADMINISTRATOR, Resource=XALIONDATASRV</code><code>.</code><code>RESOLVE</code>
<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=<all>, Role=ADMINISTRATOR, Resource=XALIONDATASRV</code><code>.</code><code>RESOLVE</code>
<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=YH , Role=<all>, Resource=XALIONDATASRV</code><code>.</code><code>RESOLVE</code>
<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=<all>, Role=<all>, Resource=XALIONDATASRV</code><code>.</code><code>RESOLVE</code>
<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=YH , Role=ADMINISTRATOR, Resource=EDITORRESOURCES</code>
<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=<all>, Role=ADMINISTRATOR, Resource=EDITORRESOURCES</code>
<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=YH , Role=<all>, Resource=EDITORRESOURCES</code>
<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=<all>, Role=<all>, Resource=EDITORRESOURCES</code>
<code>GetAuthorization: Attempting subrole authorization</code><code>for</code><code>: Actor=YH , Role=ADMINISTRATOR, Resource=XALIONDATASRV</code><code>.</code><code>RESOLVE</code>
<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=YH , Role=READER, Resource=XALIONDATASRV</code><code>.</code><code>RESOLVE</code>
<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=<all>, Role=READER, Resource=XALIONDATASRV</code><code>.</code><code>RESOLVE</code>
<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=YH , Role=READER, Resource=EDITORRESOURCES</code>
<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=<all>, Role=READER, Resource=EDITORRESOURCES</code>
<code>GetAuthorization: Unauthorized Actor=YH, Role=READER, Resource=xaliondatasrv</code><code>.</code><code>RESOLVE</code>
<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=YH , Role=EDITOR, Resource=XALIONDATASRV</code><code>.</code><code>RESOLVE</code>
<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=<all>, Role=EDITOR, Resource=XALIONDATASRV</code><code>.</code><code>RESOLVE</code>
<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=YH , Role=EDITOR, Resource=EDITORRESOURCES</code>
<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=<all>, Role=EDITOR, Resource=EDITORRESOURCES</code>
kbmmw 還提供了自定義的登入及退出方式,大家可以根據實際情況,自己操作。
總之,有了這個認證管理器後,伺服器的安全性進一步加強。
另外也可以利用這個,實作目前用戶端的通路情況。