SAF.Authorization的目標之一是把權限設置從應用代碼中分離出來,從而在無須修改和重新編譯應用代碼的情況下,就可以改變類和方法的訪問權限信息。
實現方式:
1.在方法和類上使用SAFSecurity特性,並以一個不重複的字符串作爲名稱;
[SAFSecurity(SecurityAction.Demand, Name="NameSpace.Class1.Method1")]
2.在配置文件中定義用戶角色和方法、類的訪問關係,並指定授權對象;
<Framework type="SAF.Configuration.ConfigurationManager,SAF.Configuration">
<SAF.Authorization>
<Providers>
<Provider name="Generic" type="SAF.Authorization.GenericAuthorizationProvider,SAF.Authorization,Version=1.0.0.0, Culture=neutral, PublicKeyToken=b638212fecba0404" />
<Provider name="Windows" type="SAF.Authorization.WindowsAuthorizationProvider,SAF.Authorization,Version=1.0.0.0, Culture=neutral, PublicKeyToken=b638212fecba0404" />
</Providers>
<Permissions>
<Allows>
<Allow name="MyAssembly.MyType.MyMethod1" roles="BUILTINAdministrators,Managers" provider="Windows" />
</Allows>
<Denies>
<Deny name="MyAssembly.MyType.MyMethod2" roles="BUILTINAdministrators" provider="Windows" />
</Denies>
<Denies>
<Deny name="MyAssembly.MyType.MyMethod3" roles="Anoymous" provider="Generic" />
</Denies>
</Permissions>
</SAF.Authorization>
</Framework>
..............
3.程序運行時授權對象驗證當前用戶的角色是否有訪問權限;
編譯時編譯器將SAFSecurity特性對象作爲安全特性對象存入元數據,運行期間調用安全特性對象的CreatePermission()方法取得一個IPermission對象--就是SAFSecurityPermission,調用其Demand()方法驗證用戶權限;
在書作者的實現中此時將驗證的大任交給IAuthorizationProvider的一個對象來承擔,對象是使用配置信息來構建的,此時就實現了權限邏輯從框架代碼中分離的效果,權限驗證類用戶可自定義;
問題:
配置文件中每一個方法的可訪問和不可訪問定義中都有一個provider屬性,如果一個方法在Allows組中定義的provider和Denies組中定義的provider不一致會不會產生錯誤?
權限屬性類:
權限判斷類:
權限提供者接口定義:
書作者實現的兩個權限提供者類之一: