# 系统权限缓存设计
# 授权场景分析
# 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;