多用户角色权限访问模块问题”的解决思路( 位运算 + 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-省行管理员, 2-分行管理员, 0-网点负责人(普通会员),4-超级管理员)。

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操作,省略代码。。。。。。。。
         }
    }

时间: 2024-10-06 16:50:09

多用户角色权限访问模块问题”的解决思路( 位运算 + ActionFilterAttribute )的相关文章

OA 办公自动化系统:权限管理模块的实现原理思路

OA系统分有许多的模块,如系统管理模块.等一些比较高级的业务操作.此类业务是不允许让普通员工来操作的,思路如下: 给系统添加角色表,每个用户对应一个角色,每个角色可以拥有多个权限, 如下:创建权限表(PRIVILEGE): 该表定义了权限操作的名称以及可操作的action路径,权限还定义了其下的二级子权限. 通过表中列的设计大致可以看出我前台关于对应权限操作的标签应是从该表中的NAME列来进行取值(进一步动态渲染成用户可以看到的标签来)的. 创建值为与角色相关联的表(sys_position_p

RDIFramework.NET ━ 9.9 角色权限管理 ━ Web部分

RDIFramework.NET ━ .NET快速信息化系统开发框架 9.9  角色权限管理 -Web部分 角色权限管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户.可以分配或授予指定角色的模块(菜单)的访问权限.可以收回或分配指定角色的操作(功能)权限.可以对所有角色.用户.模块(菜单).操作(功能)权限进行集中批量设置,角色户授权范围的设置(类似于用户授权范围的设置),表字段权限的设置以及表约束条件权限的设置等.角色权限管理主界面如下

xp 中的IIS安装成功之后,访问网页显示没有权限访问解决方法

在做xp的IIS发布网站时遇到一个问题就是当你访问网站的时候,显示没有权限访问网站,但是我已经开启了匿名访问网站了,怎么还没有权限访问呢?后来经过上网搜资料解决,当时很多网上都说没打开匿名访问,当时我就仔细查看了一下,我又点开网站的目录安全性,查看匿名访问是否被选中,当时我点进去之后发现匿名访问已经被选中了啊.为什么还不能上呢.后来我才发现原来是因为匿名访问的用户错了,一开始安装的IIS的匿名访问用户是7BKSBRPUUJY1Z9N\IWAM_7BKSBRPUUJY1Z9N,主要是IWAM账号是

Kibana多用户创建及角色权限控制

1 介绍 ELK日志管理属于基础设施平台,接入多个应用系统是正常现象,如果接入多个系统的索引文件没有进行权限划分,那么很大程度会出现索引文件误处理现象,为了避免这种情况发生,多用户及权限设置必不可少. 通过Filebeat采集应用日志,发送到redis(或者kafka),通过在filebeat.yml中设置fields.log_type属性来确定是哪个应用生成的日志文件,然后在logstash中针对不同的fields.log_type发往elasticsearch时创建不同的索引文件. 针对不同

首次使用windows管理界面访问安装在UNIX或linux下的DP服务器时提示无权限访问的解决方法

用windwos GUI管理界面连接时提示无权限访问: 在/etc/opt/omni/server/users/userlist 添加一行: "" "*" "*" * "admin"  再次运行DP的图形界面即可正常访问DP了.

角色权限系统的 一些概念

用一个功能模块来举例子.一.建立角色功能并做分配:1.如果现在要做一个员工管理的模块(即Resources),这个模块有三个功能,分别是:增加,修改,删除.给这三个功能各自分配一个ID,这个ID叫做功能代号:Emp_addEmp,Emp_deleteEmp,Emp_updateEmp.2.建立一个角色(Role),把上面的功能代码加到这个角色拥有的权限中,并保存到数据库中.角色包括系统管理员,测试人员等.3.建立一个员工的账号,并把一种或几种角色赋给这个员工.比如说这个员工既可以是公司管理人员,

mysqsl--用户-角色-权限表的设计

设计一个灵活.通用.方便的权限管理系统. 在这个系统中,我们需要对系统的所有资源进行权限控制,那么系统中的资源包括哪些呢?我们可以把这些资源简单概括为静态资源(功能操作.数据列)和动态资源(数据),也分别称为对象资源和数据资源,后者是我们在系统设计与实现中的叫法. 系统的目标就是对应用系统的所有对象资源和数据资源进行权限控制,比如应用系统的功能菜单.各个界面的按钮.数据显示的列以及各种行级数据进行权限的操控. 三.相关对象及其关系 大概理清了一下权限系统的相关概念,如下所示: 1.      

RBAC用户角色权限设计方案

转自http://www.cnblogs.com/zwq194/archive/2011/03/07/1974821.html RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色-权限”的授权模型.在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系.(如下图) 角色是什么?可以理解为一定数量的权限的集合,权限的载体.例如:一个论坛系统

扩展RBAC用户角色权限设计方案

RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色-权限”的授权模型.在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系.(如下图) 角色是什么?可以理解为一定数量的权限的集合,权限的载体.例如:一个论坛系统,“超级管理员”.“版主”都是角色.版主可管理版内的帖子.可管理版内的用户等,这些是权限.要给某个用户授予这些权限,不需要直接将