shiro写后台权限认证,基于url和parameter,大家来指正

allen_limi 发布于 2018/02/22 12:22
阅读 1K+
收藏 0

请各位大大耐心看完以下设计,并提出不合理之处,或改进意见,非常感谢!

手游后台,目前权限是按照url拦截的。用户表、角色表、权限表简化结构如下:

permission   权限表    
id         int                         权限ID                
url varchar 权限URL

 

role   角色表    
id         int                 角        ID    
name     varchar   角色名

 

user   用户表    
id         int                 用户id            
username varchar 用户名
password  varchar 用户密码

 

role-permission   角色与权限一对多关系表    
id         int                            
role_id int                 角色id,外键
permission_id int                 权限id,外键

 

user-role   用户与角色一对多关系表    
id         int                            
role_id int                 角色id,外键
user_id int                 用户id,外键

目前permission中的url结构示例:

/{module}/player/**     // 指定模块下的玩家操作权限(**涵盖增删改)

其中的module是按照游戏划分,比如game1、game2,但是每个游戏下有很多运营平台,管理员点击菜单时也需要对平台做权限验证。

目前的做法是给role表增加可管理的平台列表字段:

role   角色表
id         int                 角        ID    
name     varchar   角色名
platforms varchar 可管理的平台列表,json[1,2,3...]

则在url请求时,url自带platform参数,然后进入method后,先获取当前user的platforms列表,然后匹配是否允许操作该platform

url结构:/{module}/player/**?platform=2

这样设计的话,可以定义一个filter来拦截url,匹配{module}和**做第一次权限验证,然后进入方法进行第二次platform权限拦截。缺点显而易见,每个method都要验证一次platform。

本来想把platform也涉及到url中,但不是每个url都会带platform参数,有些功能是直接基于module操作,不用区分platform的,所以现在纠结该怎么设计,才能避免目前的缺陷。

如果以后有需要新增按国家验证权限,我目前的做法只能是继续在role表上增加country字段,扩展性感觉不是很好。

各位大大有什么更好的方案吗?请大家支招,非常感谢。

 

加载中
0
0
tanghc
tanghc

参考下吧:

新建一张表manager,存放各个权限类型,现在只有一种platform

表名:manager
id
name

再建一张manager_role关联表,关联manager_id和role_id

以后要加国家验证权限,在manager表中新增一条记录name=country,然后关联role

返回顶部
顶部