热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ASP.NET.4.5.1+MVC5.0设置系统角色与权限(一)

这篇文章主要介绍了ASP.NET.4.5.1+MVC5.0设置系统角色与权限的部分内容,后续我们将继续讨论这个话题,希望小伙伴们喜欢。

数据结构

权限分配

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

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

代码如下:

namespace HR.Helpers
{
    public enum EnumMoudle
    {
        ///
        /// 模块
        ///

        [EnumTitle("用户管理")]
        SysUserManage_Role = 102,
        [EnumTitle("机构管理")]
        Department = 201,
        [EnumTitle("人事资料")]
        Employees = 301,
        [EnumTitle("系统管理")]
        BaseInfo = 404,
    }
}

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

代码如下:

namespace HR.Helpers
{
    public class ControllerBase : Controller
    {
        ///
        /// 操作人,传IP....到后端记录
        ///

        public virtual Operater Operater
        {
            get
            {
                return null;
            }
        }
        ///
        /// 分页大小
        ///

        public virtual int PageSize
        {
            get
            {
                return 15;
            }
        }
        protected ContentResult JsonP(string callback, object data)
        {
            var json = Newtonsoft.Json.JsonConvert.SerializeObject(data);
            return this.Content(string.Format("{0}({1})", callback, json));
        }
        ///
        /// 当弹出DIV弹窗时,需要刷新浏览器整个页面
        ///

        ///
        public ContentResult RefreshParent(string alert = null)
        {
            var script = string.Format("", string.IsNullOrEmpty(alert) ? string.Empty : "alert('" + alert + "')");
            return this.Content(script);
        }
        public new ContentResult RefreshParentTab(string alert = null)
        {
            var script = string.Format("", string.IsNullOrEmpty(alert) ? string.Empty : "alert('" + alert + "')");
            return this.Content(script);
        }
        ///
        /// 用JS关闭弹窗
        ///

        ///
        public ContentResult CloseThickbox()
        {
            return this.Content("");
        }
        ///
        ///  警告并且历史返回
        ///

        ///
        ///
        public ContentResult Back(string notice)
        {
            var cOntent= new StringBuilder("");
            return this.Content(content.ToString());
        }
        public ContentResult PageReturn(string msg, string url = null)
        {
            var cOntent= new StringBuilder("");
            return this.Content(content.ToString());
        }
        ///
        /// 转向到一个提示页面,然后自动返回指定的页面
        ///

        ///
        ///
        ///
        public ContentResult Stop(string notice, string redirect, bool isAlert = false)
        {
            var cOntent= "" + notice + "";
            if (isAlert)
                cOntent= string.Format("", notice, redirect);
            return this.Content(content);
        }
        ///
        /// 在方法执行前更新操作人
        ///

        ///
        public virtual void UpdateOperater(ActionExecutingContext filterContext)
        {
            if (this.Operater == null)
                return;
            WCFContext.Current.Operater = this.Operater;
        }
        public virtual void ClearOperater()
        {
            //TODO
        }
        ///
        /// AOP拦截,在Action执行后
        ///

        /// filter context
        protected override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
            if (!filterContext.RequestContext.HttpContext.Request.IsAjaxRequest() && !filterContext.IsChildAction)
                RenderViewData();
            this.ClearOperater();
        }
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            this.UpdateOperater(filterContext);
            base.OnActionExecuting(filterContext);
            //在方法执行前,附加上PageSize值
            filterContext.ActionParameters.Values.Where(v => v is Request).ToList().ForEach(v => ((Request)v).PageSize = this.PageSize);
        }
        ///
        /// 产生一些视图数据
        ///

        protected virtual void RenderViewData()
        {
        }
        ///
        /// 当前Http上下文信息,用于写Log或其他作用
        ///

        public WebExceptionContext WebExceptionContext
        {
            get
            {
                var exceptiOnContext= new WebExceptionContext
                {
                    IP = Fetch.UserIp,
                    CurrentUrl = Fetch.CurrentUrl,
                    RefUrl = (Request == null || Request.UrlReferrer == null) ? string.Empty : Request.UrlReferrer.AbsoluteUri,
                    IsAjaxRequest = (Request == null) ? false : Request.IsAjaxRequest(),
                    FormData = (Request == null) ? null : Request.Form,
                    QueryData = (Request == null) ? null : Request.QueryString,
                    RouteData = (Request == null || Request.RequestCOntext== null || Request.RequestContext.RouteData == null) ? null : Request.RequestContext.RouteData.Values
                };
                return exceptionContext;
            }
        }
        ///
        /// 发生异常写Log
        ///

        ///
        protected override void OnException(ExceptionContext filterContext)
        {
            base.OnException(filterContext);
            var e = filterContext.Exception;
            LogException(e, this.WebExceptionContext);
        }
        protected virtual void LogException(Exception exception, WebExceptionContext exceptiOnContext= null)
        {
            //do nothing!
        }
    }
    public class WebExceptionContext
    {
        public string IP { get; set; }
        public string CurrentUrl { get; set; }
        public string RefUrl { get; set; }
        public bool IsAjaxRequest { get; set; }
        public NameValueCollection FormData { get; set; }
        public NameValueCollection QueryData { get; set; }
        public RouteValueDictionary RouteData { get; set; }
    }
}

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();
        ///
        /// 用户权限
        ///

        public virtual List PermissionList
        {
            get
            {
                var permissiOnList= new List();
                return permissionList;
            }
        }
        public string BusinessPermissionString { get; set; }
        [NotMapped]
        public List BusinessPermissionList
        {
            get
            {
                if (string.IsNullOrEmpty(BusinessPermissionString))
                    return new List();
                else
                    return BusinessPermissionString.Split(",".ToCharArray()).Select(p => int.Parse(p)).Cast().ToList();
            }
            set
            {
                BusinessPermissiOnString= string.Join(",", value.Select(p => (int)p));
            }
        }
        ///
        /// Action方法执行前没有权限提示信息
        ///

        ///
        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();
            permissiOnAttributes= filterContext.ActionDescriptor.GetCustomAttributes(typeof(PermissionAttribute), false).Cast().Union(permissionAttributes);
            var attributes = permissionAttributes as IList ?? 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 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 添加管理员
        ///
        /// 添加页
        ///

        /// 管理员实体类
        ///
        [Authorize]
        public ActionResult Add()
        {
            var moudleList = EnumHelper.GetItemValueList();
            this.ViewBag.MoudleList = new SelectList(mouldeList, "Key", "Value");
            return View();
        }
        ///
        /// 添加事件
        ///

        /// 实体类
        ///
        ///
        [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();
                this.ViewBag.MoudleList = new SelectList(moudleList, "Key", "Value", string.Join(",", model.BusinessPermissionString.ToString()));
                return View(model);
            }
            else
                return View("404");
        }

以上就是本文的全部内容了,后续我们将持续更新,小伙伴们是否喜欢本系列文章呢?


推荐阅读
author-avatar
轰炸籹厕所744
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有