多用户角色权限访问模块问题”的解决思路( 位运算 + ActionFilterAttribute )
如果你还是不太懂位运算,请看我的文章:那些年我们一起遗忘的位运算!
下面是我在这次项目中学习到的,我眼中的位运算的应用!主要是实现 通知的3个操作:
1. 置顶
2. 设为首页
3. 同时为 “置顶”+ “设为首页”
效果如图:

我们要想简便的进行位运算,我们可以直接进行如下枚举定义,以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());
}

此项目需求就是根据给用户分配的权限,进行相应的权限模块浏览功能,因为项目不是很大,所以权限没有去用一张表去存,我的解决思路如下,希望大家给点建议。
数据库用户表结构如下:

数据库表梳理:
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 )的更多相关文章
- 《分销系统-原创第一章》之“多用户角色权限访问模块问题”的解决思路( 位运算 + ActionFilterAttribute )
此项目需求就是根据给用户分配的权限,进行相应的权限模块浏览功能,因为项目不是很大,所以权限没有去用一张表去存,我的解决思路如下,希望大家给点建议. 数据库用户表结构如下: 数据库表梳理: BankUs ...
- 装Oracle12C时遇到没有权限访问临时位置的解决方法
今天在装oracle12c是遇到了一个很奇怪的问题,显示是没有权限访问临时位置,可是我明明是用管理员的账号登陆的啊,最后在包姐的帮助下解决了,知其然,而我却不知其所以然.但还是把方法写下,希望能帮到一 ...
- OA 办公自动化系统:权限管理模块的实现原理思路
OA系统分有许多的模块,如系统管理模块.等一些比较高级的业务操作.此类业务是不允许让普通员工来操作的,思路如下: 给系统添加角色表,每个用户对应一个角色,每个角色可以拥有多个权限, 如下:创建权限表( ...
- RDIFramework.NET ━ 9.9 角色权限管理 ━ Web部分
RDIFramework.NET ━ .NET快速信息化系统开发框架 9.9 角色权限管理 -Web部分 角色权限管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移 ...
- ABP Zero 导航菜单之角色权限
本文的项目是官网生成,项目名称为XX,WEB为MVC,以Users权限模块为例解说文章. 1.定义PermissionNames PermissionNames是一个静态类,它在/XX.Core/Au ...
- xp 中的IIS安装成功之后,访问网页显示没有权限访问解决方法
在做xp的IIS发布网站时遇到一个问题就是当你访问网站的时候,显示没有权限访问网站,但是我已经开启了匿名访问网站了,怎么还没有权限访问呢?后来经过上网搜资料解决,当时很多网上都说没打开匿名访问,当时我 ...
- DRF框架之 用户角色权限与访问频率的权限设置
1. 简单演示,创建一个models的数据库表 class User(models.Model): name=models.CharField(max_length=32) pwd=models.Ch ...
- nfs服务共享,解决文件没有权限访问问题
最近在了解一些服务权限的设置,突然就被这个nfs服务的权限给绊住了.当你挂载上服务器上的共享目录 时,却无法访问里面的一些内容.内心满满的忧桑...经过努力奋斗几分钟终于搞明白了. 无法访问的原因:因 ...
- Kibana多用户创建及角色权限控制
1 介绍 ELK日志管理属于基础设施平台,接入多个应用系统是正常现象,如果接入多个系统的索引文件没有进行权限划分,那么很大程度会出现索引文件误处理现象,为了避免这种情况发生,多用户及权限设置必不可少. ...
随机推荐
- 【BFS】【枚举】HihoCoder - 1251 - The 2015 ACM-ICPC Asia Beijing Regional Contest - C - Today Is a Rainy Day
题意:给你两个只由1~6组成的串,问你B串至少要经过几次操作变成A串. 一次操作要么选择一个种类的数,将其全部变成另一种类:要么选择一个数,将其变为另一个数. 可以证明,一定先进行一定数量的第一种操作 ...
- Hash表及hash算法的分析
Hash表中的一些原理/概念,及根据这些原理/概念: 一. Hash表概念 二. Hash构造函数的方法,及适用范围 三. Hash处理冲突方法,各自特征 四. ...
- Unity Pivot/Center与Local/Global总结
Untiy左上角有两个按钮 Pivot/Center 和 Local/Global 它们叫做 变换Gizmo工具 Pivot/Center:现实游戏对象的轴心参考点.Center为以所有选中物体所 ...
- 去除两端margin的方法
假如有一份视觉稿,其中一部分是实现这样的: 两排横向排列的框,它们中间有边距,两端无边距.每个框大小为100*100,外边距为20,整个区域为460*220. HTML结构: <div> ...
- SLVA299A : Load Disconnect ( Input to Output Isolation ) for the TPS61040
http://www.ti.com/lit/an/slva299a/slva299a.pdf Many boost converters have an external rectifier diod ...
- MYSQL 名人博客
: DavidYang的博客 - CSDN.NET DimitriK's (dim) Weblog Xaprb · Stay Curious! 飞鸿无痕的博客 - ChinaUnix博客 何登成的技术 ...
- [转载] 无所不能的“蚂蚁”--Ant
说他无所不能,好像有点夸张,但是用过Ant之后,感觉真的是只有想不到没有作不到.Ant,原作者选择他作为软件名字的意思是指"令一个简洁的工具"(Another Neat Tool) ...
- 固定的价格就意味着背叛——《practices of an agile developper》
“对这个项目,我们必须要有固定的报价.虽然我们还不清楚项目的具体情况,但仍要有一个报价.到星期一,我需要整个团队的评估,并且我们必须要在年末交付整个项目.” Venkat & Andy 提出了 ...
- jquery empty()方法
empty() 方法从被选元素移除所有内容,包括所有文本和子节点. $(selector).empty() <html> <head> <script type=&quo ...
- 将matlab的figure保存为pdf,避免图片太大缺失
有时画的matlab图太大,或者有太多的子图,导致图太宽,如果直接保存成pdf的话,会导致左右边丢失,显示不下.一个有效又简单的办法是: 1.在matlab figure里面,Edit -> ...