ddd 访问权限_Lind.DDD.Authorization用户授权介绍

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 classAuthorizationLoginFilter : AuthorizeAttribute

{///

///验证失败后所指向的控制器和action///可以在使用特性时为它进行赋值///

public AuthorizationLoginFilter(string failControllerName = "Home", string failActionName = "Login")

{

_failControllerName=failControllerName;

_failActionName=failActionName;

}public string_failControllerName, _failActionName;public override voidOnAuthorization(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", newRouteValueDictionary {

{"Action",_failActionName },

{"Controller", _failControllerName},

{"returnUrl", HttpContext.Current.Request.Url.ToString() } });

}

}

}

}

授权模块的CurrentUser的实现

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

///

///当前登陆的用户信息///可以有Redis Session和Session进行实现///

public classCurrentUser

{#region Public Properties

///

///当然登陆的用户ID///

public static stringUserID

{get{return (System.Web.HttpContext.Current.Session["UserID"] ?? string.Empty).ToString();

}

}///

///当前登陆的用户名///

public static stringUserName

{get{return (System.Web.HttpContext.Current.Session["UserName"] ?? string.Empty).ToString();

}

}///

///用户角色///

public static stringRole

{get{return (System.Web.HttpContext.Current.Session["Role"] ?? string.Empty).ToString();

}

}///

///用户权限///增,删,改,查///

public static stringAuthority

{get{return (System.Web.HttpContext.Current.Session["Authority"] ?? string.Empty).ToString();

}

}///

///当前登陆用户存储的扩展信息///

public static stringExtInfo

{get{return (System.Web.HttpContext.Current.Session["ExtInfo"] ?? string.Empty).ToString();

}

}///

///是否登陆///

public static boolIsLogin

{get{return !string.IsNullOrWhiteSpace(UserID);

}

}#endregion

#region Public Methods

///

///退出登陆///

public static voidExit()

{

System.Web.HttpContext.Current.Session.Abandon();//清除全部Session

}///

///将用户信息持久化到Session///

///

///

///

public static voidSerialize(stringuserID,stringuserName,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用户授权这块就说到这里,如果对大家有帮助,请您点个赞吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【实例简介】 项目采用经典DDD架构(用沃恩.弗农大神的话,其实这是DDD-Lite)思想进行开发,简洁而不简单,实用至上,并且所写每一行代码都经过深思熟虑,符合SOLID规则! ####当前版本 3.0 alpha版(2017-2-7) 采用全新工作流,实现自定义表单处理; 2.0版(2016-10-31) 支持多流程模板; 增加Ace admin界面支持 秀外 输入图片说明 输入图片说明 输入图片说明 慧 教科书级的分层思想,哪怕苛刻的你阅读的是大神级精典大作(如:《企业应用架构模式》《重构与模式》《ASP.NET设计模式》等),你也可以参考本项目。不信?有图为证,Resharper自动生成的项目引用关系,毫无PS痕迹! 输入图片说明 实用 符合国情的RBAC(基于角色的访问控制),可以直接应用到你的系统。 权限资源 菜单权限 经理和业务员登陆系统拥有的功能菜单是不一样的 按钮权限 经理能够审批,而业务员不可以 数据权限 A业务员看不到B业务员的单据 字段权限 某些人查询客户信息时看不到客户的手机号或其它字段 用户应用系统的具体操作者,我这里设计用户是可以直接给用户分配菜单/按钮,也可以通过角色分配权限。 角色为了对许多拥有相似权限的用户进行分类管理,定义了角色的概念,以上所有的权限资源都可以分配给角色,角色和用户N:N的关系。 机构树形的公司部门结构,国内公司用的比较多,它实际上就是一个用户组,机构和用户设计成N:N的关系,也就是说有时候一个用户可以从属于两个部门,这种情况在我们客户需求的确都出现过。 ####系统工程结构: OpenAuth.Domain 系统领域层 OpenAuth.Repository 系统仓储层,用于数据库操作 OpenAuth.App 应用层,为界面提供接口 OpenAuth.Mvc 采用基于jquery与bootstrap的B-JUI界面 OpenAuth.UnitTest 单元测试 Infrastructure 通用工具集合 ####使用 管理员可直接在登录界面点击基于精典DDD的权限管理 - 点击以开发者账号登录登录; 普通应用账号使用:test(密码:test)登录; ####后续 更多狂野的功能,正在玩命加载,敬请期待... 更多文档正在整理.... 当然,如果你想学习完整的DDD框架,可以参考我的另一个项目(BestQ&A--开源国推荐项目/集CQRS AES等DDD高级特性于一体的问答系统) 【实例截图】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值