用户权限管理体系及其SpringBoot实现
用户管理体系的演变
最早期的实现
流程
不同的用户有不同的角色,用一个role_status表示
比如0代表学生1代表老师
用户根据用户名密码登录后程序通过if else等简单的逻辑判断看用户的role_status从而判断用户是否可以访问相关页面,操作相关菜单按钮。
缺陷
- 耦合性太高,每个方法中都会有大量的if else来判断用户的role_status从而决定什么给用户展现
- 扩展性太低,如果新加入一种role_status,那势必要大量的更改代码,几乎重写所有的方法
拦截器拦截URL
流程
通过拦截器拦截所有的请求这些请求就是@GetMapping等注解上的url
并设置拦截的规则,如不会拦截登录请求,不会拦截静态资源。
不同的用户可以方法不同的url,数据库中维护着所有的url,并维护着用户和他能访问的url的对应关系(就是那些用户能访问那些url)
缺点
没有统一的标准
粒度太细,在资源层面上无法统一。
RBAC权限模型
流程
RBAC是基于角色的访问控制,是用户通过角色与权限进行关联,为什么不直接给用户分配权限呢?简单来说,一个用户拥有多个角色,每个角色拥有若干权限。这样就构成了“用户-角色-权限”的授权模型。在这个模型中,用户与角色、角色与权限之间是多对多的关系。(这样解决上面的粒度太细的问题)
根据角色授权的思想,我们需要设计五张表
(1)三张主表
用户表(user)
角色表(role)
资源表(resource)
(2)两张中间表
用户角色表(user_role)
角色资源表(role_resource)
一个用户可以有多种角色,一种角色可以访问多种资源。当一个用户使用系统时会通过联表查询他的角色,查询他的角色具有的资源,从而判断他是否可以使用某些共能,查看某些界面
使用springboot实现权限验证
流程图下
首先是登录,验证登录信息并生成token
为了方便用户名和密码直接写死了
@PostMapping("login")
public ResultJson login(@RequestParam String userName, @RequestParam String password){
User user=null;
if(userName.equals("lala")&&password.equals("lala")){
List<String> au=new ArrayList<>();
au.add("look");
user=new User(&#