给女朋友讲某宝是如何设计用户权限管理的(一)
一、概述
java应用系统设计过程中,用户认证、用户授权、鉴权是绕不过去的话题。
如果这个权限管理的设计,没有做到与业务系统的隔离,拓展性不够强,很容易就会拖后腿。
这个问题应该做过开发的同学都会有所体会。
现在网络上的各种关于权限管理的框架比较主流的有 Shiro, ,Sa-Token(新兴起的一个优秀框架)。
这里会有同学说,既然已经有这么多的成熟优秀的权限管理框架,为什么还有再给大家介绍这种实现思路。
在本人工作和学习的过程中,经常会使用这些优秀的权限管理框架。
但是,一旦是这些三方框架出现的异常和问题,想要排查,就比较麻烦。要么就是靠着百度大家的经验。要么就是猛扒代码,一点点去排查。
三方框架对于我们使用者来说,就像是一个黑盒。这一点一直让我觉得有点不顺畅。
同学们,谁不想要一个自己知根知底的的权限管理框架呢。
二、框架使用体验
2.1 项目初始化配置
老三样。
引入pom依赖:
修改配置文件:
2.2 用户登录
自定义一个凭证类
自定义一个凭证类认证器:
这个认证器很简单 就是默认admin 密码 然后给与了固定的角色和全部的资源。实际应用中应该从数据库中获取到用户的权限 并组织返回的。
开放认证接口:
2.3 权限验证
路由级别鉴权:
不用做其他额外的配置 只需要打上@ 就会获取到层的当前url地址,并校验用户是否有访问该url的权限。
并将解析后的用户信息放到方法的参数中
在第一步用户登录时,默认给了.() ,则配置了 /** 的url访问权限。
方法级别鉴权
验证用户是否登录
三、时间地点人物
想要描述一个事情,都是将时间地点人物介绍完,才能吧事情描述清楚。
介绍这个设计思路也需要介绍前提:
3.1 什么时候用这个框架
显然,如果系统需要提供用户认证、用户授权、用户鉴权的时候,就需要有一个权限管理的模块。
整个流程应该是:
用户认证 --> 颁发token(用户授权) --> 用户鉴权 --> token回收
3.2 框架要提供哪些能力
以上能力老生常谈就是最基础的权限管理。
3.3 框架应该有哪些抽象组件
这个问题是面向对象开发的java程序员必须要好好思考的问题,就是当你接到一个需求时,如何以面向对象的思维来分析和设计程序来完成需求。
3.3.1 用户认证
用户认证,最最常见的场景就是用户名密码登录。
在这个场景中可能存在:
用户名+密码、用户名+密码+验证码、手机号+验证码、邮箱+验证码 ...... 这么多的登录方式。
而通常来验证这些登录信息是否合法,一般都是要去数据库中读取用户的注册信息来完成认证。
这个场景下可以抽象出来的类有:
1. 凭证类:用户名+密码、用户名+密码+验证码、手机号+验证码、邮箱+验证码 ......
2. 凭证类验证器:用来验证用户上传的凭证是否是合法的。
3.3.2 用户授权
当用户完成认证凭证验证后,服务器应该返回一个用户的口令(token),给用户使用。
并且用户的token应该可以关联并携带出用户绑定的所有资源权限,和角色、部门、岗位等等信息。
用户的资源又分为:
静态资源:
菜单、按钮等静态资源
文档、图片等静态资源
动态资源:
对某种资源的CURD权限:如 是否可以对 表数据进行CURD。
这个场景下可以抽象出来的类:
其中的岗位和部门,有些权限管理框架中没有,有的或许有一个,这里不纠结这个问题,无论是部门还是岗位,其实都是提供了一种权限判断的维度,类型给用户打上一种标签。
3.3.3 token管理
生成用户token后,所有的token需要管理起来。可以用来统计和维护。
所以需要将上一步获取到的用户权限描述类的信息与token建立一种映射关系。从而可以通过token获取到用户的各种信息。
这个场景可以抽象出来的类:
Token管理类:用来管理所有生成的token。并建立用户信息与token的关联关系。
3.3.4 用户鉴权
当用户通过用户认证和用户授权后,就获取到了他的token口令。
每次用户来访问服务资源时token 权限管理·(中国)官方网站,都需要携带token,当服务器收到请求后,需要通过token获取到用户的所有的权限信息,来判断用户是否可以访问当前资源。
这个场景似乎没有可以抽离出来的类,而是我们要找到一种用户鉴权的方案。
这里imToken钱包官网,根据以往的经验,基于的AOP切面编程应该是对使用者最友好的方式
所以这里总结下我们需要鉴权的类型:
四、小结
上面铺垫了那么些,其实只是想让大家能跟笔者有一个相同的认知。
先梳理下上面总结出来的类。
凭证类、凭证类验证器、token生成器、token管理器。
以及,基于AOP实现的用户鉴权方案。
大致思路:
未完待续。。。