Lind.DDD.Authorization用户授权介绍

回到目录

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

AuthorizeAttribute和ActionFilterAttribute

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

aaarticlea/png;base64,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" alt="" />

aaarticlea/png;base64,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" alt="" />

实现原理,方法拦截

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

AuthorizationLoginFilter过滤器的实现

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

    /// <summary>
/// 授权过滤器
/// Function:MVC模式下使用
/// Author:Lind.zhang
/// </summary>
public class AuthorizationLoginFilter : AuthorizeAttribute
{ /// <summary>
/// 验证失败后所指向的控制器和action
/// 可以在使用特性时为它进行赋值
/// </summary>
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登场的时候了,设计很简单,一个方法用来持久化用户授权的对象,几个属性用来返回需要返回的内容,呵呵 !

    /// <summary>
/// 当前登陆的用户信息
/// 可以有Redis Session和Session进行实现
/// </summary>
public class CurrentUser
{
#region Public Properties
/// <summary>
/// 当然登陆的用户ID
/// </summary>
public static string UserID
{
get
{
return (System.Web.HttpContext.Current.Session["UserID"] ?? string.Empty).ToString();
}
}
/// <summary>
/// 当前登陆的用户名
/// </summary>
public static string UserName
{
get
{
return (System.Web.HttpContext.Current.Session["UserName"] ?? string.Empty).ToString();
}
}
/// <summary>
/// 用户角色
/// </summary>
public static string Role
{
get
{
return (System.Web.HttpContext.Current.Session["Role"] ?? string.Empty).ToString();
}
}
/// <summary>
/// 用户权限
/// 增,删,改,查
/// </summary>
public static string Authority
{
get
{
return (System.Web.HttpContext.Current.Session["Authority"] ?? string.Empty).ToString();
}
}
/// <summary>
/// 当前登陆用户存储的扩展信息
/// </summary>
public static string ExtInfo
{
get
{
return (System.Web.HttpContext.Current.Session["ExtInfo"] ?? string.Empty).ToString();
}
}
/// <summary>
/// 是否登陆
/// </summary>
public static bool IsLogin
{
get
{
return !string.IsNullOrWhiteSpace(UserID);
}
}
#endregion #region Public Methods
/// <summary>
/// 退出登陆
/// </summary>
public static void Exit()
{
System.Web.HttpContext.Current.Session.Abandon();//清除全部Session
}
/// <summary>
/// 将用户信息持久化到Session
/// </summary>
/// <param name="userID"></param>
/// <param name="userName"></param>
/// <param name="ExtInfo"></param>
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用户授权这块就说到这里,如果对大家有帮助,请您点个赞吧!

回到目录

上一篇:Django Linux环境下部署CentOS7+Python3+Django+uWSGI+Nginx(含Nginx返回400问题处理、防火墙管理)


下一篇:HDU4745 - Two Rabbits(区间DP)