通用版的权限验证领域模块设计

背景

这里是根据我以往的经验,针对一般情况的用户登录的领域设计,理想情况下一个比较简单的领域设计。
需求:

  1. 有多个系统
  2. 不同的系统都有各自的菜单和按钮
  3. 不同的按钮可以根据不同的角色绑定或者和不同的用户绑定(这里就忽略了角色)

设计

本文进行的是最简单的系统声明设计。读者可以根据自己的需要区拓展表的字段。

多个系统

在这里插入图片描述

菜单和按钮

在这里插入图片描述

角色和按钮

在这里插入图片描述

角色和用户之间

用户属于用户领域,按照界限上下文权限领域也是属于用户领域下的,所以划分了权限领域,那么用户领域肯定不能掺杂进来。
在这里插入图片描述
上面是比较标准的过程,但是实际情况往往更加复杂。
我下面举几个例子拓展一下上面的领域设计。

假如我对性能要求很高,并且我的数据量很大,几亿个用户,而且要满足我旗下的员工或者我授权的某个人,关系亲近的人,还有我所有的顾客快速登录,获取权限的需求。那么我可以做如下修改:

在这里插入图片描述
首先角色的权限是改动较少的部分,另外大数据量的时候我们往往会分库分表,分库分表的同时也会带了了中间表较难处理的问题,针对这个问题要解决就需要做异构索引表,但是如果我们使用了以上的方式,就可以巧妙地避开这个问题。
上面的方法就是把所有的按钮放在一个镜像(即某个时刻数据的样子,也称之为数据快照)中,存成一个json字符串即可。

同理,针对一个用户可以有多个角色,高性能这种做法,也需要做如下动作:
在这里插入图片描述
这里我可以使用用户id做分库分表的拆分键,就算我有几个亿的用户,但是外部拿这个userId来这里查这个人的权限的时候,相信也不会慢。

要满足旗下员工登录 这个需求比较特殊,在设计系统的时候,单表其实是最好提高性能的手段,所以要满足登录的高性能,建议维护一张用户登录表。这张表的数据量会很大,现在假设有几个亿。

假设我的系统有多个登录手段:

  1. 我的用户直接登录,用手机号码或者卡号
  2. 我的妻子可以登录,用我的卡号,加载出她的手机号码,然后登录
  3. 我个人可以用手机号码登录,也可以用卡号登录
  4. 我的员工可以用我的卡号,加载出所有员工的卡号,再登录

针对这种需求,我会设计两张表:

  1. 通过卡号登录
    在这里插入图片描述
    上面是员工较少的做法,如果员工过多,其实不会有下拉这种需求,也没有客户会从10000个员工里面选出自己。如果员工过百,过千建议上表放到mongo db中。
  2. 通过手机号码登录
    在这里插入图片描述
    通过卡号登录:只能是用户自己登录,可以使用卡号去做卡号登录表拆分键,从而提高性能。
    通过手机登录:通过卡号去卡号登录表找出这个卡号关联的手机号码有哪些,关联的phone对应的user_id有哪些。然后再到手机登录表中验证,是否可以登录。
    以上两个方式都是获取到userId,然后使用userId去获取用户权限。

权限控制的性能优化方向可以考虑将哪些常用的数据放入redis中,再做一层ehcache。比如登录表最近使用的1000w个用户数据(LRU算法。)。

还有就是可以充分利用mongodb,尽量使设计简单化。

理想化的权限控制中心,最好带一个可视化的界面,并且支持导出数据,从而提高团队其它成员的开发效率。

  • 1
    点赞
  • 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、付费专栏及课程。

余额充值