zoukankan      html  css  js  c++  java
  • MVC基于角色权限控制--权限过滤

    用户访问服务器实际上就是访问控制器下的方法,因此在权限控制就是控制器方法的访问权限

    为了方便控制,我们可以建立一个基类控制器(BaseController),让需要的控制器继承这个控制器即可,在BaseController我们实现权限的控制

    用户访问时先查询该用户对应角色的权限,如果有则直接跳转,如果未具备该权限则查询该用户直接对应权限的信息,如果没有则跳转错误页面

    namespace CZBK.ItcastOA.WebApp.Controllers
    {
        public class BaseController : Controller
        {
            public UserInfo LoginUser { get; set; }
            /// <summary>
            /// 执行控制器中的方法之前先执行该方法。
            /// </summary>
            /// <param name="filterContext"></param>
            protected override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                base.OnActionExecuting(filterContext);
                //if (Session["userInfo"] == null)
                bool isSucess = false;
                if(Request.Cookies["sessionId"]!=null)
                {
                    string sessionId = Request.Cookies["sessionId"].Value;
                    //根据该值查Memcache.
                    object obj=Common.MemcacheHelper.Get(sessionId);
                    if(obj!=null)
                    {
                        UserInfo userInfo = Common.SerializeHelper.DeserializeToObject<UserInfo>(obj.ToString());
                       LoginUser = userInfo;
                       isSucess = true;
                       Common.MemcacheHelper.Set(sessionId, obj, DateTime.Now.AddMinutes(20));//模拟出滑动过期时间.
      //完成权限校验。
                        //获取用户请求的URL地址.
                       string url = Request.Url.AbsolutePath.ToLower();
                        //获取请求的方式.
                       string httpMehotd = Request.HttpMethod;
                        //根据获取的URL地址与请求的方式查询权限表。
    IApplicationContext ctx = ContextRegistry.GetContext(); IBLL.IActionInfoService ActionInfoService = (IBLL.IActionInfoService)ctx.GetObject("ActionInfoService");
                //查询当前地址对应的权限信息
    var actionInfo= ActionInfoService.LoadEntities(a=>a.Url==url&&a.HttpMethod==httpMehotd).FirstOrDefault(); if (actionInfo != null) { filterContext.Result = Redirect("/Error.html"); return; } //判断用户是否具有所访问的地址对应的权限
    IUserInfoService UserInfoService = (IUserInfoService)ctx.GetObject("UserInfoService"); var loginUserInfo = UserInfoService.LoadEntities(u=>u.ID==LoginUser.ID).FirstOrDefault(); //1:可以先按照用户权限这条线进行过滤。 var isExt =(from a in loginUserInfo.R_UserInfo_ActionInfo where a.ActionInfoID == actionInfo.ID select a).FirstOrDefault(); if (isExt != null) { if (isExt.IsPass) { return; } else { filterContext.Result = Redirect("/Error.html"); return; } } //2:按照用户角色权限这条线进行过滤。 var loginUserRole = loginUserInfo.RoleInfo; var count = (from r in loginUserRole from a in r.ActionInfo where a.ID == actionInfo.ID select a).Count(); if (count < 1) { filterContext.Result = Redirect("/Error.html"); return; } } // filterContext.HttpContext.Response.Redirect("/Login/Index"); } if (!isSucess) { filterContext.Result = Redirect("/Login/Index");//注意. } } } }

    注意:因为在BaseController中不能通过Spring.net配置文件直接拿到UserInfoService,所以通过ContextRegistry.GetContext()方法创建一个IApplicationContext对象,通过该对象的GetObject方法,拿到配置文件Service.xml中的对象

    在BaseController中先对用户Session进行判断,判断用户是否登录,这里用的是Memache储存的序列化后的用户信息,根据用户Cookie中携带的MemacheID查找数据库中的数据

    string httpMehotd = Request.HttpMethod;
    string url = Request.Url.AbsolutePath.ToLower(); 得到用户当前请求方法的地址

    根据路径和请求方法找到对应权限的对象
    var actionInfo= ActionInfoService.LoadEntities(a=>a.Url==url&&a.HttpMethod==httpMehotd).FirstOrDefault();
    查找当前用户直接对应权限表中的权限
    var isExt =(from a in loginUserInfo.R_UserInfo_ActionInfo
                                   where a.ActionInfoID == actionInfo.ID
                                   select a).FirstOrDefault();
    根据当前用户对应角色权限查找
                       var loginUserRole = loginUserInfo.RoleInfo;
                       var count = (from r in loginUserRole
                                   from a in r.ActionInfo
                                   where a.ID == actionInfo.ID
                                   select a).Count();
     
  • 相关阅读:
    react的路由权限控制
    react的路由中的switch和exact的使用
    react中antd的表格自定义展开
    webstorm的git操作使用
    ES6的相关语法
    vue导出文件下载
    vue如何解析xml文件 x2js
    ES6模板字符串
    彻底卸载微软拼音输入法
    systemverilog新增的always_comb,always_ff,和always_latch语句
  • 原文地址:https://www.cnblogs.com/xiaoliwang/p/7866447.html
Copyright © 2011-2022 走看看