Kummy's Blog

o(︶︿︶)o { name : 'Kummy' , job : 'Feser' }

《分销系统-原创第一章》之“多用户角色权限访问模块问题”的解决思路( 位运算 + ActionFilterAttribute )

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

 

数据库用户表结构如下

 

数据库表梳理:

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

 

  

 

 

 

posted @ 2013-09-29 11:52  李 维  阅读(1651)  评论(3编辑  收藏  举报