天天看點

使用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

<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=&lt;all&gt;, Role=ADMINISTRATOR, Resource=XALIONDATASRV</code><code>.</code><code>RESOLVE</code>

<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=YH , Role=&lt;all&gt;, Resource=XALIONDATASRV</code><code>.</code><code>RESOLVE</code>

<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=&lt;all&gt;, Role=&lt;all&gt;, 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=&lt;all&gt;, Role=ADMINISTRATOR, Resource=EDITORRESOURCES</code>

<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=YH , Role=&lt;all&gt;, Resource=EDITORRESOURCES</code>

<code>GetAuthorization: Attempt authorization</code><code>for</code><code>: Actor=&lt;all&gt;, Role=&lt;all&gt;, 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=&lt;all&gt;, 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=&lt;all&gt;, 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=&lt;all&gt;, 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=&lt;all&gt;, Role=EDITOR, Resource=EDITORRESOURCES</code>

kbmmw 還提供了自定義的登入及退出方式,大家可以根據實際情況,自己操作。

總之,有了這個認證管理器後,伺服器的安全性進一步加強。

另外也可以利用這個,實作目前用戶端的通路情況。