# 系统权限缓存设计

# 授权场景分析

# 1. 权限标识符授权

这种情况下,url 不能重复,也就是不区分 method.每一个 url 都会对应一个唯一权限标识符,如:

名称 资源 url 标识符
列表查询 /pet/cat/list catList
新增数据 /pet/cat/save catSave
查看详情 /pet/cat/detail catDetail

这种情况下,权限缓存,属于一对一关系,可以采用如下数据格式缓存 :

Map<String,String> perms;

以 url 为 key,以标识符为 value

# 2. 角色授权

RBAC 权限模型中,一个角色可以拥有多个 url 资源,一个用户可以拥有多个角色。

对应到授权管理,就意味着拦截一个 url,同时需要知道这个 url 需要具备哪些角色才能访问。如:

名称 资源 url 角色
列表查询 /pet/cat/list admin,guest,user
新增数据 /pet/cat/save admin,user
查看详情 /pet/cat/detail guest,user

这种情况下,url 不可重复。 对应到缓存中,就是一个 key 对应一个角色集合,一对多关系。 可以采用如下数据格式缓存:

Map<String,Collection<String>> perms;

# 3. Restful 资源授权

Restful,表现层状态转移,简单说就是:URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。这种场景下,需要用 Method + url 组合来唯一定位一个权限项。 如:

名称 操作 资源 url
列表查询 GET /pet/cat
新增数据 POST /pet/cat
查看详情 GET /pet/cat/*

这种资源风格,url 就会存在重复,所以不能只通过 url 唯一定位资源了,可以采用 Method+":"+url的形式唯一定位。 对应授权判定逻辑,首先需要根据 url 判断这个 url 是否需要授权拦截,这一步,url 是否重复不重要,需要被拦截,再判定用户具有的此 url 的 Method 是否与当前访问资源的 Method 相同,Method 相同,则可认为具备权限。

这种情况下,权限缓存只需要 key 即可,value 不参与鉴权流程,所以采用 :

Map<String,String> perms;

综上

  场景 1 和 2 其实可以算作同一种授权方式,这种授权方式 通过 url 唯一定位资源,通过特定字符串(角色、权限标识)来判定是否授权。

  场景 3 Restful 风格资源是比较特殊的授权方式,只能通过 method+url 来定位唯一资源。

# 结论

  • 全局系统权限缓存采用
//全局系统缓存
//key = url
//value = 角色标识或者权限标识
Map<String,Collection<String>> perms;
上次更新:: 1/25/2021, 4:26:40 PM