7

Matrxi-Web权限设计

 3 years ago
source link: https://www.fangzhipeng.com/springboot/2020/05/07/mw-permission.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Matrxi-Web权限设计

对于一个后端系统来说,权限是基础设施,是安全保障。没有权限,系统可能随时面临各种风险,所以权限设计对后端系统来说至关重要。在Javaweb开发中,有很多权限开发的框架,比如shrio、Spring security,但是都比较重量级。作为一个后端管理系统来说,用这样的权限开发框架会拖慢开发进度。所以在这个项目中,我写了一个更简单的权限控制框架,使用很简单。

权限设计思路

在Matrxi-Web项目中,请求需要携带Token,请求经过Filter的时候(实际项目是使用Spring MVC的HandlerInterceptor),会判断该请求Url是否有Token。如果有Token,解析Token获取用户信息,如果解析Token失败,则进入白名单判断的逻辑,如果解析成功,则请求通过。如果请求不携带Token或者解析Token失败,则判断是否Url白名单里(比如登录接口,swagger文档等接口),如果请求不在url白名单内,则提示无权限访问。

在Filter层初步判断,如果请求通过,则请求进入具体类的方法里,比如Controller的方法。如果类方法加上了自定义的注解@HasPermission,则该类在加载的时候会生成一个aroud类型的切面(即spring的aop),在执行具体类的方法前,会判断该用户是否具有对该方法的调用权限,从而起到权限控制的作用。

mw013.jpg

在权限控制数据层面,最常用的做法是RBAC(Role-Based Access Control),即基于角色的权限的控制。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。

RBAC 认为授权实际上是Who 、What 、How 三元组之间的关系,也就是Who 对What 进行How 的操作,也就是“主体”对“客体”的操作。

  • Who:是权限的拥有者或主体(如:User,Role)。
  • What:是操作或对象(operation,object)。
  • How:具体的权限(Privilege,正向授权与负向授权)。

在Matrix-Web项目中,也是使用了经典的RBAC,即每个用户拥有一个或多个角色,角色赋予具体的菜单操作权限。Martrix-Web的数据库设计标如下图所示:

matrix-web009.jpg

用户Id(user_id)和角色Id(role_id)绑定,角色Id(role_id)和menu_code(菜单编码绑定),所以在创建用户的时候需要录入用户的角色,而角色又需要绑定权限。前端界面录入权限按钮,展示图如下:

mw010.jpg

用户绑定角色,展示图如下:

mw011.jpg

Token设计

在系统设置中,有一个重要的东东是Token,Token代表了用户,几乎所有的请求都需要携带Token。那么Token是怎么来的呢?它是根据用户名生成的。那么什么情况会生产呢?用户登录成功后,生成Token,返回给浏览器,浏览器存储在LocalStorage里面,后续的所有请求必须携带Token。这样根据Token,服务端就能知道每个请求的用户是谁,从而判断该请求的用户是否有权限。

mw012.jpg

上面的几个小结讲述了Matrix-web整体实现的权限控制的思路。现在来做一下总结:

  • 首先,用户需要登录,填用户名、密码,后端接收到登录请求,进行用户、密码的校验,校验成功后则根据用户名生成Token,并返回给浏览器。
  • 浏览器收到Token后,会存储在本地的LocalStorge里。
  • 后续浏览器发起请求时都携带该Token,请求达到后端后,会在Filter进行判断,首选判断是否为白名单url(比如登录接口url),如果是则放行;否则进入Token验证。如果有Token且解析成功,则放行,否则,返回无权限访问。
  • Filter判断后,请求达到具体的Controller层,如果在Controller层上加上了权限判断的注解,则生成代理类。代理类在执行具体方法前会根据Token判断权限。
    • 取出用户的Token并解析得到该请求的userId,根据userId在从存储层获取用户的权限点。权限控制是RBAC这种方式实现的。
    • 获取到用户权限点后,获取权限判断的注解的权限信息,看用户权限点是否包含权限注解的权限信息,如果包含,则权限校验通过,否则则请求返回无权限。

https://github.com/forezp/matrix-web

本文为原创文章,转载请标明出处。
本文链接:https://www.fangzhipeng.com/springboot/2020/05/07/mw-permission.html
本文出自方志朋的博客


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK