1.数据结构
Mad_Popedom为权限表控制记录控制器名行动记录动作名疯狂角色为角色表。 2.权限控制的实现此处使用比较简单面向切面编程方式,用手动音量调节的过滤器实现,代码如下复制代码代码如下:使用系统。集合。通用;使用系统网络。手动音量调节使用Madnet .模特。MadAdmin使用Madnet .BLL,马德明;命名空间Madnet .控制器MadAdmin(公共类supportFilterAttribute : actionFilterAttribute {私有bool _ IsLogin=true///摘要///是否需要登录////summary public bool IsLogin { set { _ IsLogin=value;}获取{如果(系统.配置。配置管理器。appsettings[' IsLogin ']!=null) { bool .系统配置。配置管理器。appsettings[' IsLogin '].ToString(),out _ IsLogin);} return _ IsLogin } } action executing(action executing context filter context)上的公共重写void { string controllerName=(字符串)filter context .路由数据。值['控制器'];字符串actionName=(字符串)filterContext .路由数据。值['操作'];if (IsLogin filterContext .会话[' log in _ User ']==null){ filterContext .HttpContext。响应。重定向(新的UrlHelper(filterContext .RequestContext ).操作('登录''默认');filterContext .结果=新EmptyResult();} else if (IsLogin filterContext .会话['登录_用户']!=null){ Mad _ User用户用户=筛选器上下文.会话['登录用户]为疯狂用户;if(!user.is_super) { if(!GetPopedom(用户)。存在(p=p .控制器名称==控制器名称.降低()p . Action _ Name==Action Name .ToLower())) { filterContext .HttpContext。回应。写下('没有权限');filterContext .结果=新EmptyResult();} } } } }///摘要///获取当前用户所有有权限执行的动作////summary///returns/returns public ListAtmodel GetPopedom(Mad _ User User){ ListAtmodel ATS=new ListAtmodel();ListMad _ pope DOM pops=Mad _ pope DOM bll .GetPopedombyUser(用户。user _ id);流行音乐中的疯狂流行音乐.添加(新的AtModel() { Controller_Name=pop .控件,操作名=弹出. action });}返回ats} } }解释一下,上面的代码就是在执行前,先获取登录用户可以运行的控制器-动作,然后和当前需要执行的控制器-动作比较,如存在,即通过,否则为没有权限执行。3.为动作添加权限为简单起见,对于控制器层我是独立出来一个类库的,好处是等会为角色添加权限的时候我们不需要手动输入,只要反射dll就可以了
如图所示,凡需要权限控制的函数,只需要添加[支持过滤器]特性就可以了,当然这种方式只能控制到行动级。4.为角色额添加权限这个比较简单,只需要把角色和权限关联起来就可以了,这里我是用反射控制器层dll实现网络配置
全球。阿萨克斯。cs
Madnet .控制器。测试即为控制器层的dll
试验为控制器名,索引为行动名,选择角色2可以访问的行动,提交到数据库即可。此图表示角色2拥有测试一控制器的访问权限,但是没有测试2控制器,测试3控制器的访问权限。5.结束上面四步即已完成基本的权限控制。可以在此基础上加上用户组,用户,菜单等管理,可实现"用户-角色-权限"的自由组合,一个简单的通用后台大概就是这样了