zoukankan      html  css  js  c++  java
  • 主攻ASP.NET.4.5.1 MVC5.0之重生:系统角色与权限(一)

    数据结构

    权限分配

    1.在项目中新建文件夹Helpers

    2.在HR.Helpers文件夹下添加EnumMoudle.Cs 

    namespace HR.Helpers
    {
        public enum EnumMoudle
        {
            /// <summary>
            /// 模块
            /// </summary>
            [EnumTitle("用户管理")]
            SysUserManage_Role = 102,
    [EnumTitle(
    "机构管理")] Department = 201, [EnumTitle("人事资料")] Employees = 301, [EnumTitle("系统管理")] BaseInfo = 404, } }

    3.在HR.Helpers文件夹下添加ControllerBase.Cs 

      1 namespace HR.Helpers
      2 {
      3     public class ControllerBase : Controller
      4     {
      5         /// <summary>
      6         /// 操作人,传IP....到后端记录
      7         /// </summary>
      8         public virtual Operater Operater
      9         {
     10             get
     11             {
     12                 return null;
     13             }
     14         }
     15 
     16         /// <summary>
     17         /// 分页大小
     18         /// </summary>
     19         public virtual int PageSize
     20         {
     21             get
     22             {
     23                 return 15;
     24             }
     25         }
     26 
     27         protected ContentResult JsonP(string callback, object data)
     28         {
     29             var json = Newtonsoft.Json.JsonConvert.SerializeObject(data);
     30             return this.Content(string.Format("{0}({1})", callback, json));
     31         }
     32 
     33         /// <summary>
     34         /// 当弹出DIV弹窗时,需要刷新浏览器整个页面
     35         /// </summary>
     36         /// <returns></returns>
     37         public ContentResult RefreshParent(string alert = null)
     38         {
     39             var script = string.Format("<script>{0}; parent.location.reload(1)</script>", string.IsNullOrEmpty(alert) ? string.Empty : "alert('" + alert + "')");
     40             return this.Content(script);
     41         }
     42 
     43         public new ContentResult RefreshParentTab(string alert = null)
     44         {
     45             var script = string.Format("<script>{0}; if (window.opener != null) {{ window.opener.location.reload(); window.opener = null;window.open('', '_self', '');  window.close()}} else {{parent.location.reload(1)}}</script>", string.IsNullOrEmpty(alert) ? string.Empty : "alert('" + alert + "')");
     46             return this.Content(script);
     47         }
     48 
     49         /// <summary>
     50         /// 用JS关闭弹窗
     51         /// </summary>
     52         /// <returns></returns>
     53         public ContentResult CloseThickbox()
     54         {
     55             return this.Content("<script>top.tb_remove()</script>");
     56         }
     57 
     58         /// <summary>
     59         ///  警告并且历史返回
     60         /// </summary>
     61         /// <param name="notice"></param>
     62         /// <returns></returns>
     63         public ContentResult Back(string notice)
     64         {
     65             var content = new StringBuilder("<script>");
     66             if (!string.IsNullOrEmpty(notice))
     67                 content.AppendFormat("alert('{0}');", notice);
     68             content.Append("history.go(-1)</script>");
     69             return this.Content(content.ToString());
     70         }
     71 
     72 
     73         public ContentResult PageReturn(string msg, string url = null)
     74         {
     75             var content = new StringBuilder("<script type='text/javascript'>");
     76             if (!string.IsNullOrEmpty(msg))
     77                 content.AppendFormat("alert('{0}');", msg);
     78             if (string.IsNullOrWhiteSpace(url))
     79                 url = Request.Url.ToString();
     80             content.Append("window.location.href='" + url + "'</script>");
     81             return this.Content(content.ToString());
     82         }
     83 
     84         /// <summary>
     85         /// 转向到一个提示页面,然后自动返回指定的页面
     86         /// </summary>
     87         /// <param name="notice"></param>
     88         /// <param name="redirect"></param>
     89         /// <returns></returns>
     90         public ContentResult Stop(string notice, string redirect, bool isAlert = false)
     91         {
     92             var content = "<meta http-equiv='refresh' content='1;url=" + redirect + "' /><body style='margin-top:0px;color:red;font-size:24px;'>" + notice + "</body>";
     93 
     94             if (isAlert)
     95                 content = string.Format("<script>alert('{0}'); window.location.href='{1}'</script>", notice, redirect);
     96 
     97             return this.Content(content);
     98         }
     99 
    100         /// <summary>
    101         /// 在方法执行前更新操作人
    102         /// </summary>
    103         /// <param name="filterContext"></param>
    104         public virtual void UpdateOperater(ActionExecutingContext filterContext)
    105         {
    106             if (this.Operater == null)
    107                 return;
    108 
    109             WCFContext.Current.Operater = this.Operater;
    110         }
    111 
    112         public virtual void ClearOperater()
    113         {
    114             //TODO
    115         }
    116 
    117         /// <summary>
    118         /// AOP拦截,在Action执行后
    119         /// </summary>
    120         /// <param name="filterContext">filter context</param>
    121         protected override void OnActionExecuted(ActionExecutedContext filterContext)
    122         {
    123             base.OnActionExecuted(filterContext);
    124             if (!filterContext.RequestContext.HttpContext.Request.IsAjaxRequest() && !filterContext.IsChildAction)
    125                 RenderViewData();
    126 
    127             this.ClearOperater();
    128         }
    129 
    130         protected override void OnActionExecuting(ActionExecutingContext filterContext)
    131         {
    132             this.UpdateOperater(filterContext);
    133             base.OnActionExecuting(filterContext);
    134 
    135             //在方法执行前,附加上PageSize值
    136             filterContext.ActionParameters.Values.Where(v => v is Request).ToList().ForEach(v => ((Request)v).PageSize = this.PageSize);
    137         }
    138 
    139         /// <summary>
    140         /// 产生一些视图数据
    141         /// </summary>
    142         protected virtual void RenderViewData()
    143         {
    144         }
    145 
    146         /// <summary>
    147         /// 当前Http上下文信息,用于写Log或其他作用
    148         /// </summary>
    149         public WebExceptionContext WebExceptionContext
    150         {
    151             get
    152             {
    153                 var exceptionContext = new WebExceptionContext
    154                 {
    155                     IP = Fetch.UserIp,
    156                     CurrentUrl = Fetch.CurrentUrl,
    157                     RefUrl = (Request == null || Request.UrlReferrer == null) ? string.Empty : Request.UrlReferrer.AbsoluteUri,
    158                     IsAjaxRequest = (Request == null) ? false : Request.IsAjaxRequest(),
    159                     FormData = (Request == null) ? null : Request.Form,
    160                     QueryData = (Request == null) ? null : Request.QueryString,
    161                     RouteData = (Request == null || Request.RequestContext == null || Request.RequestContext.RouteData == null) ? null : Request.RequestContext.RouteData.Values
    162                 };
    163 
    164                 return exceptionContext;
    165             }
    166         }
    167 
    168         /// <summary>
    169         /// 发生异常写Log
    170         /// </summary>
    171         /// <param name="filterContext"></param>
    172         protected override void OnException(ExceptionContext filterContext)
    173         {
    174             base.OnException(filterContext);
    175             var e = filterContext.Exception;
    176 
    177             LogException(e, this.WebExceptionContext);
    178         }
    179 
    180         protected virtual void LogException(Exception exception, WebExceptionContext exceptionContext = null)
    181         {
    182             //do nothing!
    183         }
    184     }
    185 
    186     public class WebExceptionContext
    187     {
    188         public string IP { get; set; }
    189         public string CurrentUrl { get; set; }
    190         public string RefUrl { get; set; }
    191         public bool IsAjaxRequest { get; set; }
    192         public NameValueCollection FormData { get; set; }
    193         public NameValueCollection QueryData { get; set; }
    194         public RouteValueDictionary RouteData { get; set; }
    195     }
    196 }
    View Code

    4.在项目文件夹中新建ControllerBase.cs

    namespace HR
    {
        public abstract class ControllerBase:HR.Helpers.ControllerBase
        {
            protected override void OnActionExecuted(ActionExecutedContext filterContext)
            {
                base.OnActionExecuted(filterContext);
            }
    
            protected override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                base.OnActionExecuting(filterContext);
            }
        }
    }

    5.在项目中新建RoleControllerBase.cs

    namespace HR
    {
        public class RoleControllerBase : ControllerBase
        {
            SystemUserRepository sysuserrepository = new SystemUserRepository();
            /// <summary>
            /// 用户权限
            /// </summary>
            public virtual List<EnumMoudle> PermissionList
            {
                get
                {
                    var permissionList = new List<EnumMoudle>();
                    return permissionList;
                }
            }
            public string BusinessPermissionString { get; set; }
            [NotMapped]
            public List<EnumMoudle> BusinessPermissionList 
            {
                get
                {
                    if (string.IsNullOrEmpty(BusinessPermissionString))
                        return new List<EnumMoudle>();
                    else
                        return BusinessPermissionString.Split(",".ToCharArray()).Select(p => int.Parse(p)).Cast<EnumMoudle>().ToList();
                }
                set
                {
                    BusinessPermissionString = string.Join(",", value.Select(p => (int)p));
                }
            }
            /// <summary>
            /// Action方法执行前没有权限提示信息
            /// </summary>
            /// <param name="filterContext"></param>
            protected override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                var noAuthorizeAttributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof(AuthorizeIgnoreAttribute), false);
                if (noAuthorizeAttributes.Length > 0)
                    return;
    
                base.OnActionExecuting(filterContext);
    
       
                bool hasPermission = true;
                var permissionAttributes = filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(PermissionAttribute), false).Cast<PermissionAttribute>();
                permissionAttributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof(PermissionAttribute), false).Cast<PermissionAttribute>().Union(permissionAttributes);
                var attributes = permissionAttributes as IList<PermissionAttribute> ?? permissionAttributes.ToList();
                if (permissionAttributes != null && attributes.Count() > 0)
                {
                     string cookie = CookieHelper.GetValue("SystemUserID");
                     if (string.IsNullOrEmpty(cookie))
                     {
                         filterContext.Result = Content("您没有登录!");
                     }
                     else
                     {
                         int mid = int.Parse(CookieHelper.GetValue("SystemUserID"));
                         var model = sysuserrepository.GetModel(mid);
                         BusinessPermissionString = model.BusinessPermissionString;
                         hasPermission = true;
                         foreach (var attr in attributes)
                         {
                             foreach (var permission in attr.Permissions)
                             {
                                 if (!BusinessPermissionList.Contains(permission))
                                 {
                                     hasPermission = false;
                                     break;
                                 }
                             }
                         }
    
                         if (!hasPermission)
                         {
                             if (Request.UrlReferrer != null)
                                 filterContext.Result = this.Stop("您没有权限!", "/default/ng");
                             else
                                 filterContext.Result = Content("您没有权限!");
                         }
                     }
                }
            }
        }
    }

    6.在每个Controller继承RoleControllerBase类

    public class EmployeesController : RoleControllerBase

    7.在HR.Helpers文件夹下添加PermissionAttribute.Cs ,并继承 FilterAttribute, IActionFilter

    namespace HR.Helpers
    {
        public class PermissionAttribute : FilterAttribute, IActionFilter
        {
            public List<EnumMoudle> Permissions { get; set; }
    
            public PermissionAttribute(params EnumMoudle[] parameters)
            {
                Permissions = parameters.ToList();
            }
    
            public void OnActionExecuted(ActionExecutedContext filterContext)
            {
                //throw new NotImplementedException();
            }
    
            public void OnActionExecuting(ActionExecutingContext filterContext)
            {
                //throw new NotImplementedException();
            }
        }
    }

    8.然后在Controller或者Action方法加上验证

     [Permission(EnumMoudle.Employees),Authorize, ValidateInput(false)]
     [Permission(EnumMoudle.SysUserManage_Role)]

    9.在用户管理Controller中添加权限分配,修改方法

            #region 添加管理员
            /// <summary>
            /// 添加页
            /// </summary>
            /// <param name="model">管理员实体类</param>
            /// <returns></returns>
            [Authorize]
            public ActionResult Add()
            {
                var moudleList = EnumHelper.GetItemValueList<EnumMoudle>();
                this.ViewBag.MoudleList = new SelectList(mouldeList, "Key", "Value");
    
                return View();
            }
        
    
            /// <summary>
            /// 添加事件
            /// </summary>
            /// <param name="model">实体类</param>
            /// <param name="fc"></param>
            /// <returns></returns>
            [Authorize, HttpPost, ValidateInput(false)]
            public ActionResult Add(SystemUser model, FormCollection fc)
            {
                model.BusinessPermissionString = fc["MoudelList"];
                model.State = 1;
                model.CreateTime = DateTime.Now;
                systemuserrepository.SaveOrEditModel(model);
                return RedirectToAction("UserList");
            }
            #endregion
    
            //修改权限
            [Authorize, AcceptVerbs(HttpVerbs.Post), ValidateInput(false)]
            public ActionResult Edit(int id, FormCollection fc)
            {
                var model = systemuserrepository.GetModel(id);
    
                if (model != null)
                {
                    string password = model.PassWord;
                    if (Request.Form["PassWord"] != "")
                    {
                        model.BusinessPermissionString = fc["MoudleList"];
                        UpdateModel(model);
                        systemuserrepository.SaveOrEditModel(model);
                    }
                    else
                    {
                        model.BusinessPermissionString = fc["MoudleList"];
                        UpdateModel(model);
                        model.PassWord = password;
                        systemuserrepository.SaveOrEditModel(model);
                    }
                    return RedirectToAction("userlist");
                }
                else
                    return View("404");
            }
            #endregion
            [Authorize]
            public ActionResult Edit(int id)
            {
                var model = systemuserrepository.GetModel(id);
                if (model != null)
                {
                    var moudleList = EnumHelper.GetItemValueList<EnumBusinessPermission>();
                    this.ViewBag.MoudleList = new SelectList(moudleList, "Key", "Value", string.Join(",", model.BusinessPermissionString.ToString()));
    
                    return View(model);
                }
                else
                    return View("404");
            }

     关于EnumHelper枚举帮助类代码

    点击获取页面

    声明:本博客高度重视知识产权保护,发现本博客发布的信息包含有侵犯其著作权的链接内容时,请联系我,我将第一时间做相应处理,联系邮箱ffgign@qq.com


    作者:Mark Fan (小念头)    
    来源:http://cube.cnblogs.com
    说明:未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有疑问,可以通过 ffgign@qq.com 联系作者,本文章采用 知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可

    Moudle
  • 相关阅读:
    SSL JudgeOnline 1194——最佳乘车
    SSL JudgeOnline 1457——翻币问题
    SSL JudgeOnlie 2324——细胞问题
    SSL JudgeOnline 1456——骑士旅行
    SSL JudgeOnline 1455——电子老鼠闯迷宫
    SSL JudgeOnline 2253——新型计算器
    SSL JudgeOnline 1198——求逆序对数
    SSL JudgeOnline 1099——USACO 1.4 母亲的牛奶
    SSL JudgeOnline 1668——小车载人问题
    SSL JudgeOnline 1089——USACO 1.2 方块转换
  • 原文地址:https://www.cnblogs.com/cube/p/3683066.html
Copyright © 2011-2022 走看看