框架目前提供url访问、菜单和页面元素的权限控制和数据权限,权限基于角色来分配,1个用户可以属于多个角色,权限项分模块、页面、操作3级别,其中模块、页面用于url和菜单的控制,操作是对页面元素的控制。
相关模块
链接库:SRF.Security.dll、SRF.Components.Security.dll
业务层:SRF.DomainModel.Admin
如何使用
1、web.config相关的配置
<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>
2、调用
(1)配置
在后台配置功能和和数据权限。
(2)在控制器类或控制器的函数上加[Authorize],表示只有配置访问给Action时进行验证,如
[Authorize]
public class DefaultController : Controller
{}
(3)html标签权限
根据权限配置控制html标签的显示/有效。
在页面增加下边的代码:
@Html.Authorize(
new ActionItem("#add", "visible", "allowadd") //标签selector,属性(display、visible、enabled),操作编码
)
(*这里是通过js来实现html标签的控制,不保证安全)
(4)数据权限
在后台配置数据规则和sql配置的变量相对应,如
数据规则配置的过滤条件为 ”and CreatedBy=@user.id ”,sql语句:select*from OM_Order where 1=1 {$rule.byuser$}
那么用户拥有该数据规则的权限则用该过滤条件替换语句的相应的语句片段。
(5)安全相关的功能在SRF.Security.SecurityContext,提供登陆、注销、当前用户、检测是否具有访问权限等函数
如何实现
1、模型
一个用户可以属于多个角色,给角色分配权限
2、url验证
url访问验证有SRF.Security.Authorize调用 SecurityContext.HasUrlGrant()进行验证
3、html标签的显示/有效的控制
@Html.Authorize() 根据参数和权限配置生成js脚本,调用common.js的security.verify()。
4、菜单权限
网站的导航菜单采用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"/>