SRF之權限控制

框架目前提供url訪問、菜單和頁面元素的權限控制和數據權限,權限基於角色來分配,1個用戶能夠屬於多個角色,權限項分模塊、頁面、操做3級別,其中模塊、頁面用於url和菜單的控制,操做是對頁面元素的控制。
相關模塊
連接庫:SRF.Security.dll、SRF.Components.Security.dll
業務層:SRF.DomainModel.Admin
 

如何使用html

 
一、web.config相關的配置node

    <configSections>
        <section name="MembershipProvider" type="SRF.Security.Principal.MembershipSection, SRF.Security" requirePermission="false" allowDefinition="MachineToApplication" restartOnExternalChanges="true"/>
        <section name="PermissionProvider" type="SRF.Security.Permission.PermissionSection, SRF.Security" requirePermission="false" allowDefinition="MachineToApplication" restartOnExternalChanges="true"/>
        <section name="SecurityProvider" type="SRF.Security.SecuritySection, SRF.Security" requirePermission="false" allowDefinition="MachineToApplication" restartOnExternalChanges="true"/>
        <section name="DataRuleProvider" type="SRF.Security.DataRule.DataRuleSection,SRF.Security" requirePermission="false" allowDefinition="MachineToApplication" restartOnExternalChanges="true"/>
        <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
    </configSections>
    <MembershipProvider defaultProvider="MyMembershipProvider">
        <providers>
            <add name="MyMembershipProvider" type="SRF.Components.Security.MyMembershipProvider, SRF.Components.Security"/>
        </providers>
    </MembershipProvider>
    <PermissionProvider defaultProvider="MyPermissionProvider">
        <providers>
            <add name="MyPermissionProvider" type="SRF.Components.Security.MyPermissionProvider, SRF.Components.Security"/>
        </providers>
    </PermissionProvider>
    <DataRuleProvider defaultProvider="MyDataRuleProvider">
        <providers>
            <add name="MyDataRuleProvider" type="SRF.Components.Security.MyDataRuleProvider, SRF.Components.Security"/>
        </providers>
    </DataRuleProvider>
    <appSettings> 
        <!--是否對用戶密碼加密-->
        <add key="EncryptPassword" value="true"/>
        <add key="MvcSiteMapProvider_SiteMapFileName" value="~/Mvc.sitemap"/>
        <add key="MvcSiteMapProvider_SecurityTrimmingEnabled" value="true"/>
        <add key="MvcSiteMapProvider_DefaultSiteMapNodeVisibiltyProvider" value="SRF.UI.SiteMapNodeVisibilityProvider, SRF.UI"/>
    </appSettings>
View Code

二、調用web

(1)配置sql

在後臺配置功能和和數據權限。安全

 

(2)在控制器類或控制器的函數上加[Authorize],表示只有配置訪問給Action時進行驗證,如app

    [Authorize]
    public class DefaultController : Controller
   {}

(3)html標籤權限框架

根據權限配置控制html標籤的顯示/有效。
在頁面增長下邊的代碼:
@Html.Authorize(
     new ActionItem("#add", "visible", "allowadd") //標籤selector,屬性(display、visible、enabled),操做編碼
 )

  (*這裏是經過js來實現html標籤的控制,不保證安全)ide

(4)數據權限函數

在後臺配置數據規則和sql配置的變量相對應,如網站

數據規則配置的過濾條件爲 」and CreatedBy=@user.id 」,sql語句:select*from OM_Order where 1=1 {$rule.byuser$}

那麼用戶擁有該數據規則的權限則用該過濾條件替換語句的相應的語句片斷。

(5)安全相關的功能在SRF.Security.SecurityContext,提供登錄、註銷、當前用戶、檢測是否具備訪問權限等函數
  

如何實現

一、模型

 

一個用戶能夠屬於多個角色,給角色分配權限

二、url驗證

url訪問驗證有SRF.Security.Authorize調用 SecurityContext.HasUrlGrant()進行驗證

三、html標籤的顯示/有效的控制
@Html.Authorize() 根據參數和權限配置生成js腳本,調用common.js的security.verify()。


四、菜單權限
網站的導航菜單採用MvcSiteMapProvider.dll實現,SiteMapAclModule實現導航菜單的驗證

 

    /// <summary>
    /// 菜單節點過濾器
    /// </summary>
    public class SiteMapNodeVisibilityProvider : MvcSiteMapProvider.FilteredSiteMapNodeVisibilityProvider
    {
        public override bool IsVisible(MvcSiteMapProvider.ISiteMapNode node, IDictionary<string, object> sourceMetadata)
        {
            bool visible = base.IsVisible(node, sourceMetadata);
            if (visible)
            {
                visible = SRF.Security.SecurityContext.HasUrlGrant(node.Url);
            }

            return visible;
        }
    }

 

在web.config:

 <add key="MvcSiteMapProvider_DefaultSiteMapNodeVisibiltyProvider" value="SRF.UI.SiteMapNodeVisibilityProvider, SRF.UI"/>
相關文章
相關標籤/搜索