多用户角色权限访问模块问题”的解决思路( 位运算 + ActionFilterAttribute )
2015-02-09 10:59
441 查看
如果你还是不太懂位运算,请看我的文章:那些年我们一起遗忘的位运算!
下面是我在这次项目中学习到的,我眼中的位运算的应用!主要是实现 通知的3个操作:
1. 置顶
2. 设为首页
3. 同时为 “置顶”+ “设为首页”
效果如图:
![](http://images.cnitblog.com/blog/337731/201303/04103303-8bef8af2dc024b65b5a77efa48edddc3.png)
我们要想简便的进行位运算,我们可以直接进行如下枚举定义,以2的次方定义,应为他们的值很特殊:
数 二进制值
1 1 2 10 4 100 8 1000 16 10000 32 100000 64 1000000 128 10000000
我们就可以很方便的接受参数来进行位运算的操作,代码如下:
此项目需求就是根据给用户分配的权限,进行相应的权限模块浏览功能,因为项目不是很大,所以权限没有去用一张表去存,我的解决思路如下,希望大家给点建议。
数据库用户表结构如下:
![](http://images.cnitblog.com/blog/337731/201309/29112830-f9f3d2ba7a524a5a84eec449e8ec6e35.png)
数据库表梳理:
BankUserMember:权限分配表(1-省行管理员, -分行管理员, 0-网点负责人(普通会员),-超级管理员)。
BankUserInfo: 用户详细表。
BankAgent: 机构层级表。
用户权限枚举表如下:
普通会员查看功能如下代码:
(省行,分行)管理员查看功能如下代码:
权限 RoleAttribute过滤器 如下代码:
下面是我在这次项目中学习到的,我眼中的位运算的应用!主要是实现 通知的3个操作:
1. 置顶
2. 设为首页
3. 同时为 “置顶”+ “设为首页”
效果如图:
![](http://images.cnitblog.com/blog/337731/201303/04103303-8bef8af2dc024b65b5a77efa48edddc3.png)
我们要想简便的进行位运算,我们可以直接进行如下枚举定义,以2的次方定义,应为他们的值很特殊:
数 二进制值
1 1 2 10 4 100 8 1000 16 10000 32 100000 64 1000000 128 10000000
/// <summary> /// 通知类型 /// </summary> public enum NoticeType { /// <summary> /// 普通 /// </summary> [Description("普通")] Normal = 1, /// <summary> /// 置顶 /// </summary> [Description("置顶")] Top = 2, /// <summary> /// 设置首页 /// </summary> [Description("设置首页")] Home = 4, }
我们就可以很方便的接受参数来进行位运算的操作,代码如下:
/// <summary> /// 置顶及设置为首页 /// </summary> /// <param name="id"></param> /// <returns></returns> [Role] public ActionResult Workshop_NoticeSet(int id, int typeFlag) { bool res = false; Workshop_Notice entity = workshopManager.GetWorkshop_Notice(i => i.WorkshopNoticeID == id); if (entity != null) { switch ((NoticeType)typeFlag) { case NoticeType.Home: if ((entity.TypeFlag & (int)NoticeType.Home) > 0) entity.TypeFlag = entity.TypeFlag ^ (int)NoticeType.Home; //取消置顶 else entity.TypeFlag = entity.TypeFlag | (int)NoticeType.Home; //置顶 break; case NoticeType.Top: if ((entity.TypeFlag & (int)NoticeType.Top) > 0) entity.TypeFlag = entity.TypeFlag ^ (int)NoticeType.Top; //取消设为首页 else entity.TypeFlag = entity.TypeFlag | (int)NoticeType.Top; //设为首页 break; } if (workshopManager.EditWorkshop_Notice(i => new Workshop_Notice { TypeFlag = entity.TypeFlag, WorkshopNoticeID = entity.WorkshopNoticeID, }).IsComplete) res = true; } return Content(res.ToString()); }
此项目需求就是根据给用户分配的权限,进行相应的权限模块浏览功能,因为项目不是很大,所以权限没有去用一张表去存,我的解决思路如下,希望大家给点建议。
数据库用户表结构如下:
![](http://images.cnitblog.com/blog/337731/201309/29112830-f9f3d2ba7a524a5a84eec449e8ec6e35.png)
数据库表梳理:
BankUserMember:权限分配表(1-省行管理员, -分行管理员, 0-网点负责人(普通会员),-超级管理员)。
BankUserInfo: 用户详细表。
BankAgent: 机构层级表。
用户权限枚举表如下:
/// <summary> /// 用户角色 /// </summary> public enum Role { /// <summary> /// 注册会员 /// </summary> Member = 0, /// <summary> /// 省行管理员 /// </summary> ProvinceManager = 1, /// <summary> /// 分行管理员 /// </summary> BranchManager = 2, /// <summary> /// 总行管理员 /// </summary> Manager = 3, /// <summary> /// 超级管理员 /// </summary> SuperManager = 4 }
普通会员查看功能如下代码:
/// <summary> /// 会员产看功能 /// </summary> [Role(Entity.Enum.Role.Member)] public class PerformanceController : BaseController { [NoCache] public ActionResult Index(int? page) { //todo: } }
(省行,分行)管理员查看功能如下代码:
/// <summary> /// (省行,分行)管理员查看功能 /// </summary> [Role(Entity.Enum.Role.ProvinceManager | Entity.Enum.Role.BranchManager)] public class AdminPerformanceController : BaseController { [NoCache] public ActionResult Index(int? page) { //todo: } }
权限 RoleAttribute过滤器 如下代码:
/// <summary> /// Action角色访问控制 /// </summary> public class RoleAttribute : ActionFilterAttribute { /// <summary> /// 控制角色 /// </summary> public Entity.Enum.Role _role { get; set; } /// <summary> /// 登录角色 /// </summary> public int memberLoginRole = 0; public RoleAttribute() { } /// <summary> /// 验证方式和角色进行构造 /// </summary> /// <param name="flag"></param> public RoleAttribute(Entity.Enum.Role role) { _role = role; } public override void OnActionExecuting(ActionExecutingContext filterContext) { if (!CheckRole()) { string urlreffer = filterContext.HttpContext.Request.UrlReferrer == null ? string.Empty : filterContext.HttpContext.Request.UrlReferrer.AbsoluteUri; if (string.IsNullOrEmpty(urlreffer)) urlreffer = filterContext.HttpContext.Request.Url == null ? string.Empty : filterContext.HttpContext.Request.Url.AbsoluteUri; string locationUrl = string.Empty; locationUrl = TsingDa.Common.WebConfig.GetWebConfig("website_url", "") + "/Home/Login?ReturnUrl=" + filterContext.HttpContext.Server.UrlEncode(urlreffer); RedirectResult loginUrl = new RedirectResult(locationUrl); filterContext.Result = loginUrl; } else { //---------【验证用户的控制器的访问权限(利用位运算灵活的解决多角色问题)】--------- if (((int)_role & (int)memberLoginRole) <= 0 && ((int)_role != memberLoginRole)) { filterContext.Result = new RedirectResult("/Home/RoleError"); } } base.OnActionExecuting(filterContext); } private bool CheckRole() { //验证有没有登陆Cookie操作,省略代码。。。。。。。。 } }
相关文章推荐
- 《分销系统-原创第一章》之“多用户角色权限访问模块问题”的解决思路( 位运算 + ActionFilterAttribute )
- 关于“解决实现注册用户后,自动具备访问网站的权限的问题”文章中配置出现找不到角色的问题的解决办法
- 一步一步SharePoint 2007之二十一:解决实现注册用户后,自动具备访问网站的权限的问题(3)——创建用户
- 解决因用户权限导致的【Windows Installer】无法访问且无法启动的问题 - 博客频道 - CSDN.NET
- 一步一步SharePoint 2007之二十:解决实现注册用户后,自动具备访问网站的权限的问题(2)——配置Role
- 一步一步SharePoint 2007之二十一:解决实现注册用户后,自动具备访问网站的权限的问题(3)——创建用户
- 一步一步SharePoint 2007之二十:解决实现注册用户后,自动具备访问网站的权限的问题(2)——配置Role
- 启用用户访问win 2000(启用了 guest 之后,解决权限的问题。)
- 一步一步SharePoint 2007之二十一:解决实现注册用户后,自动具备访问网站的权限的问题(3)——创建用户
- 一步一步SharePoint 2007之十九:解决实现注册用户后,自动具备访问网站的权限的问题(1)——配置Provider
- 一步一步SharePoint 2007之二十:解决实现注册用户后,自动具备访问网站的权限的问题(2)——配置Role
- MOSS组、用户、权限级别,以及出现:用户不存在或用户不唯一 及 拒绝访问 问题的解决方法
- 解决Linux中普通用户无权限访问串口设备问题
- 一步一步SharePoint 2007之二十一:解决实现注册用户后,自动具备访问网站的权限的问题(3)——创建用户
- XP中如何解决备份文件夹拒绝访问问题(也可解决普通用户访问管理员用户的文件的权限问题)
- XP中如何解决备份文件夹拒绝访问问题(也可解决普通用户访问管理员用户的文件的权限问题)
- 一步一步SharePoint 2007之十九:解决实现注册用户后,自动具备访问网站的权限的问题(1)——配置Provider
- 一步一步SharePoint 2007之十九:解决实现注册用户后,自动具备访问网站的权限的问题(1)——配置Provider
- win8 解决文件夹无法访问,安装使用软件莫名报错的问题 【提升当前用户权限】
- 通用权限管理系统组件回答用户的常用问题:操作权限、用户角色、数据权限的解决方法