應用框架的設計與實現——.NET平臺(10 授權服務.源碼分析)

設計目標:
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不一致會不會產生錯誤?

權限屬性類:



權限判斷類:



權限提供者接口定義:



書作者實現的兩個權限提供者類之一: 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章