授权

授权 (能做什么?)

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,保证拦截顺序

授权逻辑

当用户请求某个路由资源,如: GET /pet/cat

查找系统权限拦截规则,先从缓存获取,没有则从数据库获取然后存入缓存,返回

遍历系统权限,以 url 进行 Ant 风格匹配判断,如果匹配,则拦截授权开始,不匹配则通过

获取当前登录用户具有的权限列表,遍历匹配

判断当前系统支持的授权形式,如果是:MethodAndUrlGrantedAuthority,进入 Restful 风格资源鉴权, 如果是:SimpleGrantedAuthority 进入精确路由路径模式鉴权。

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),则具备权限。

精确路由路径鉴权 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