博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lind.DDD.Authorization用户授权介绍
阅读量:6612 次
发布时间:2019-06-24

本文共 4762 字,大约阅读时间需要 15 分钟。

Lind.DDD.Authorization是Lind.DDD框架的组成部分,之所以把它封装到框架里,原因就是它的通用性,几乎在任何一个系统中,都少不了用户授权功能,用户授权对于任何一个系统来说都是必要的,像管理型的页面都需要用户先去登陆,然后拿到凭证,才可以进行访问,这在MVC和WebApi体系结构里是很容易实现的,像过滤器里的AuthorizeAttribute和ActionFilterAttribute都可以实现用户授权的功能。

AuthorizeAttribute和ActionFilterAttribute

AuthorizeAttribute这个过滤器从字面上就可以看出它的功能,它主要用在用户角色授权上,对于我们的系统来说,那就是哪些页面需要登陆,就把哪个Action添加这个特性,它有方法OnAuthorization,表示当页面加载之前,去判断用户是否有访问本action的权限,我们可以根据自己的需要去override它;ActionFilterAttribute过滤器是我们平时用的最多的,即在action执行前,后,View渲染前,渲染后的跟踪,我们在使用时,重写对应的方法,即可以实现对各个步骤的跟踪。

实现原理,方法拦截

在mvc里,过滤器的含义就是方法拦截,这个概念和Aop不某而合,都是对方法进行拦截,然后进行二次加工,过滤器的原理也一样,在进行拦截后,可以去填充你自己的业务逻辑,然后选择继续渲染还是离开页面。

AuthorizationLoginFilter过滤器的实现

下面是我自己整理的,用户授权的一个过滤器,分享一下

///     /// 授权过滤器    /// Function:MVC模式下使用    /// Author:Lind.zhang    ///     public class AuthorizationLoginFilter : AuthorizeAttribute    {        ///         /// 验证失败后所指向的控制器和action        /// 可以在使用特性时为它进行赋值        ///         public AuthorizationLoginFilter(string failControllerName = "Home", string failActionName = "Login")        {            _failControllerName = failControllerName;            _failActionName = failActionName;        }        public string _failControllerName, _failActionName;        public override void OnAuthorization(AuthorizationContext filterContext)        {            //被添加AllowAnonymousAttribute特性的过滤器将不参加AuthorizationLoginFilter的验证            bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true) ||                filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true);            //为登陆页添加例外,其它页都自动在global.asax里添加到全局过滤器中,MVC3及以后版本支持它            if (!skipAuthorization)            {                if (!CurrentUser.IsLogin)                {                    filterContext.Result = new RedirectToRouteResult("Default", new RouteValueDictionary {                      { "Action",_failActionName },                     { "Controller", _failControllerName},                      { "returnUrl", HttpContext.Current.Request.Url.ToString() } });                }            }        }    }

授权模块的CurrentUser的实现

对于过滤器把没有登陆的用户指引登陆页后,用户将进行登陆操作,然后Lind.DDD要做什么?需要将用户标示,角色信息,权限信息进行存储,这时就是我们CurrentUser登场的时候了,设计很简单,一个方法用来持久化用户授权的对象,几个属性用来返回需要返回的内容,呵呵 !

///     /// 当前登陆的用户信息    /// 可以有Redis Session和Session进行实现    ///     public class CurrentUser    {        #region Public Properties        ///         /// 当然登陆的用户ID        ///         public static string UserID        {            get            {                return (System.Web.HttpContext.Current.Session["UserID"] ?? string.Empty).ToString();            }        }        ///         /// 当前登陆的用户名        ///         public static string UserName        {            get            {                return (System.Web.HttpContext.Current.Session["UserName"] ?? string.Empty).ToString();            }        }        ///         /// 用户角色        ///         public static string Role        {            get            {                return (System.Web.HttpContext.Current.Session["Role"] ?? string.Empty).ToString();            }        }        ///         /// 用户权限        /// 增,删,改,查        ///         public static string Authority        {            get            {                return (System.Web.HttpContext.Current.Session["Authority"] ?? string.Empty).ToString();            }        }        ///         /// 当前登陆用户存储的扩展信息        ///         public static string ExtInfo        {            get            {                return (System.Web.HttpContext.Current.Session["ExtInfo"] ?? string.Empty).ToString();            }        }        ///         /// 是否登陆        ///         public static bool IsLogin        {            get            {                return !string.IsNullOrWhiteSpace(UserID);            }        }        #endregion        #region Public Methods        ///         /// 退出登陆        ///         public static void Exit()        {            System.Web.HttpContext.Current.Session.Abandon();//清除全部Session        }        ///         /// 将用户信息持久化到Session        ///         ///         ///         ///         public static void Serialize(            string userID,            string userName,            string extInfo = "",            string role = "",            string authority = "")        {            System.Web.HttpContext.Current.Session["UserID"] = userID;            System.Web.HttpContext.Current.Session["UserName"] = userName;            System.Web.HttpContext.Current.Session["ExtInfo"] = ExtInfo;            System.Web.HttpContext.Current.Session["Role"] = role;            System.Web.HttpContext.Current.Session["Authority"] = authority;        }        #endregion    }

OK,对于Lind.DDD.Authorization用户授权这块就说到这里,如果对大家有帮助,请您点个赞吧!

 

转载地址:http://bkaso.baihongyu.com/

你可能感兴趣的文章
如何去掉dede列表推荐时标题被加粗
查看>>
bzoj 1304: [CQOI2009]叶子的染色
查看>>
小程序引入多个e-charts
查看>>
Node.js实现热加载
查看>>
PLSQL_Oracle基本概念总结(汇总)
查看>>
分布式icinga2安装与使用
查看>>
【ASP.NET程序员福利】打造一款人见人爱的ORM(二)
查看>>
video设置视频的宽高
查看>>
C#学习九之WPF应用使用SQLite数据库详解
查看>>
【原创】Mindjet Manager思维导图软件云服务功能的使用方法
查看>>
MVC 防止 CSRF 的方法
查看>>
不使用xib创建iphone window
查看>>
sqlserver 连接查询的问题,a表无重复记录,与b表中的记录为1对N关系,如何在查得a表信息时统计b表记录数...
查看>>
2018.5.7每天一题面试题----面向对象的特征
查看>>
Jquery 弹出框出插件 仿IOS效果
查看>>
paper 8:支持向量机系列五:Numerical Optimization —— 简要介绍求解求解 SVM 的数值优化算法。...
查看>>
第八条:覆盖equals时请遵守通用约定
查看>>
flask_sqlalchemy的使用
查看>>
eclipse 常用快捷键
查看>>
PHP开发调试环境配置
查看>>