权限管理 - 18965050/authz GitHub Wiki
统一认证授权平台(medusa)采用经典的RBAC(Role-Based Access Control)管理模型, 使用shiro中的鉴权实现来完成权限的校验

(图五)
各实体对象关系说明如下:
| 关联对象 | 关系 |
|---|---|
| 用户 : 组织 | 多对一 |
| 用户 : 角色 | 多对多 |
| 角色 : 权限 | 多对多 |
| 菜单 : 模块 | 多对一 |
鉴权部分完全采用shiro的鉴权原理来实现的,shiro的鉴权体系如下:

(图六)
shiro表达式鉴权说明如下:
- 权限表达式采用
资源:操作:实例的形式来表达. 比如PROD:ADD:1表示产品ID为1的添加权限.同时, 表达式每个部分(part)支持星号(*)通配符, 星号表示此部分(part)为所有权限. 当然, shiro权限表达式也支持多于或少于三层的鉴权. 我们在实际应用中就采用了四层的表达方式:应用:模块:操作:实例 - 鉴权规则为使用已拥有的权限表达式和待鉴权的表达式进行从左至右校验.举例说明:
PROD:PROD:* 校验 PROD:PROD:VIEW ==> 校验通过 PROD:VIEW:* 校验 PROD:* ==> 校验不通过 PROD 校验 PROD:* ==> 校验通过
菜单实际上也属于一种资源.因此对于菜单是否展示是通过用户拥有的权限表达式和菜单中的权限校验表达式进行鉴权. 同时, 为了使菜单鉴权表达式使用起来更加的灵活, 我们通过springEL表达式让其支持逻辑比较以及不同对象的权限鉴权. 举例说明:
P("PROD:VIEW") && P("USER:ADD") 校验同时拥有PROD:VIEW和USER:ADD的权限
P("PROD:VIEW") || R("ADMIN") 校验拥有PROD:VIEW的权限或者拥有ADMIN的角色
!P("PROD:VEW") && (R("ADMIN") || U("abc")) 校验拥有ADMIN的角色或用户身份为abc且不拥有PROD:VIEW的权限
另外, 我们规定了如下两个菜单校验规则:
- 短路原则. 如果父菜单校验不通过, 则子菜单无需校验, 也不通过
- 空值通过原则. 如果菜单没有鉴权表达式, 则无需校验, 直接通过