# 授权

# 授权 (能做什么?)

Authorization,也就是授权操作,指的是对来访用户是否具备某操作权限进行判断进而采取对应措施。授权解决“能做什么?”的问题。

# 基本思路

通过对比用户具有的权限(用户权限)与访问资源所需的权限(系统权限),进而确定用户是否具备权限。

# 路由授权

# 说明

路由授权通过拦截器实现。路由权限支持一下两种:

  • 精确路由路径鉴权 精确路由路径指的是系统内 url 都具有唯一性,不区分 Method

    如:

    • 列表: /pet/cat/list

    • 新增: /pet/cat/save

    • 修改: /pet/cat/update

    • 删除: /pet/cat/delete

      这种模式,系统提供了:SimpleGrantedAuthority 授权实体,通过唯一 perm 标识一个路由资源 首先根据系统拦截规则对 url 进行拦截,然后通过需要的 perm 标识与用户具有的 perm 标识进行比对判定是否授权。

      如下所示:

      url 资源 权限标识 perm
      /pet/cat/list catList
      /pet/cat/save catSave
  • Restful资源授权

    对,就是你熟悉的那个 Restful 。这种模式下 url 不再唯一,需要 method+url规则 定位路由 如:

    • 列表: GET /pet/cat

    • 详情: GET /pet/cat/*

    • 新增: POST /pet/cat

    • 修改: PUT /pet/cat

    • 删除: DELETE /pet/cat/{id}

      Restful资源授权,系统提供了MethodAndUrlGrantedAuthority授权实体,通过 method+url 的形式组合权限。 首先根据系统拦截规则对,对请求 url 进行拦截,然后遍历用户具有的权限,如果有 url 相同,且 method 与当前请求 method 相同或者 method = "all"的权限,则授权通过。

    如下所示:

    资源 url value
    /pet/cat ""
    /pet/cat ""

    这种模式的系统权限,其实就是一个拦截器匹配规则,需要使用有序 Map,保证拦截顺序

# 授权逻辑

  1. 当用户请求某个路由资源,如: GET /pet/cat
  2. 查找系统权限拦截规则,先从缓存获取,没有则从数据库获取然后存入缓存,返回
  3. 遍历系统权限,以 url 进行 Ant 风格匹配判断,如果匹配,则拦截授权开始,不匹配则通过
  4. 获取当前登录用户具有的权限列表,遍历匹配
  5. 判断当前系统支持的授权形式,如果是:MethodAndUrlGrantedAuthority,进入 Restful 风格资源鉴权, 如果是:SimpleGrantedAuthority 进入精确路由路径模式鉴权。
  6. Restful资源授权 5.1 拿到当前request 的 request.method 和 request.url,遍历用户具备的所有权限 5.2 如果存在与 user.url = request.url ,则继续判断 method,否则,不具备权限。 5.3 如果user.method ==request.method ||"all".equals(user.method),则具备权限。
  7. 精确路由路径鉴权 6.1 通过 request.url 从系统权限拦截规则(Map)中获取到对应规则 6.2 遍历用户权限,以 url查找,找到继续判断用户 perm (SimpleGrantedAuthority.getAuthority())与拦截规则.perm 是否相等? 相等,则授权通过,否则授权不通过。

# 注解授权

系统实现了如下几类注解权限:

//  是否登录
@RequiresUser 
//是否具备单个角色 如: @RequiresRole("admin")
@RequiresRole 
//是否具备多个角色其一或者全部,如:@RequiresRoles(value={"admin","user"},mode=Mod.Any)
@RequiresRoles 
//是否具备某个权限标识符,如: @RequiresPermission("catList")
@RequiresPermission 
//是否具备多个权限标识符其一或者全部,如:@RequiresPermissions(value={"catList","catSave"},mode=Mod.ALL)
@RequiresPermissions
上次更新:: 1/25/2021, 4:26:40 PM