|
锁定老贴子 主题:设计一种简单高效的权限控制
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2007-04-05 关键字: 权限
现需要一个权限控制系统,有一个Admin,Admin有所有权限,其下有若干一级管理员,一级管理员拥有大部分权限,但除了功能上受到限制外,区域上也受到限制,比如有ABCDE 5个地区,一级管理员甲负责A,B,C;一级管理员乙负责D,E一个地区只有一个一级管理员,管理员之下还有二级管理员,二级管理员的地区由他的上级分配,功能也比上级少一些,一个二级管理员只能负责一个地区,而一个地区可以有多个二级管理员。另外Admin可以新增权限组,并指定该组的上级
想想如何实现,希望与数据库耦合低些 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-04-05
和liferay portal的权限管理像的很啊!!
模型设计可以使用 action+resource action是功能,resource是被操作的对象。每类resource有一组对应的action。每个resource的实例都有一个scope。 将多个action+resource category+scope组合起来成为一个role,就是你要的xxx管理员了。 不过scope逻辑上是树状结构,实现时刻可能用到递归。 |
|
| 返回顶楼 | |
|
最后更新时间:2007-04-05
我通常会设计为2种方式
1:用户id对应权限枚举! 用户表和权限表一一对应,id是外键 对于特殊业务(需要被控制起来的)全部写事务,然后编号写到到权限表中。 2:用户表继承权限用户表 一个用户只能存在在一个表中,一旦用户拥有了特殊权限就移动要权限用户表,然后在与权限枚举匹配 |
|
| 返回顶楼 | |
|
最后更新时间:2007-04-05
可以用RBAC的权限模型,将scope和功能权限都作为资源赋给角色。比较特殊的是scope自己要在内存中维持一个树形的结构,在授权的时候可以选择拥有权限的子节点。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-04-05
关于楼上RBAC的模型方式,能否详细些说,如果在内存中维护一个树形结构,如果增加权限组或者修改权限组时,会否对正在操作的管理员造成一些不可预料的情况
|
|
| 返回顶楼 | |
|
最后更新时间:2007-04-05
dada 写道 可以用RBAC的权限模型,将scope和功能权限都作为资源赋给角色。比较特殊的是scope自己要在内存中维持一个树形的结构,在授权的时候可以选择拥有权限的子节点。
如果scope和action是分离的,会造成一定的问题。 比如 如下两个许可 scope=east action=view resource_category=message scope=west action=edit resource_category=message 分别代表可以浏览东区的消息内容,可以修改西区的消息内容。 你不能独立的把scope赋予某个角色,必须同时有scope、action和resource才能定义一个许可。 |
|
| 返回顶楼 | |
|
最后更新时间:2007-04-05
jessdy 写道 关于楼上RBAC的模型方式,能否详细些说,如果在内存中维护一个树形结构,如果增加权限组或者修改权限组时,会否对正在操作的管理员造成一些不可预料的情况
我采用的方法是在缓存中构建树形结构,树节点本身实现deepClone。每一个用户登录后按照赋予他的scope权限,通过filter从缓存中deepClone(API : deepClone(Filter filter))他的scope部分,存储在他的threadLoacal中。 修改scope权限后更新缓存中的scope结构,正在操作的管理员是不会产生影响的。如果想要动态更新操作者的权限可以通过记录thread和filter的关系,当缓存中的树形结构发生变化时,同时将新的deepClone后的scope分发给操作者的线程。 |
|
| 返回顶楼 | |
|
最后更新时间:2007-04-05
pikachu 写道 dada 写道 可以用RBAC的权限模型,将scope和功能权限都作为资源赋给角色。比较特殊的是scope自己要在内存中维持一个树形的结构,在授权的时候可以选择拥有权限的子节点。
如果scope和action是分离的,会造成一定的问题。 比如 如下两个许可 scope=east action=view resource_category=message scope=west action=edit resource_category=message 分别代表可以浏览东区的消息内容,可以修改西区的消息内容。 你不能独立的把scope赋予某个角色,必须同时有scope、action和resource才能定义一个许可。 我有一个action和filter的结合设定,filter可以在该角色的scope资源中过滤出操作权限相关的scope。 感觉单靠scope不容易处理复杂授权的情况,俺是在操作者构建scope的时候使用filter从整个树模型中clone一份出来,在单个操作的时候,再用filter在自己的scope模型中过滤出可以执行操作的scope。 |
|
| 返回顶楼 | |
|
最后更新时间:2007-04-05
呵呵,推荐使用LDAP服务器,用户管理权限控制都是非常方便的
|
|
| 返回顶楼 | |
|
最后更新时间:2007-04-05
Scope和resource合起来决定一个Resource。实际上是action和Resource,跟Scope没什么关系,Scope只是Resource的一个属性。
|
|
| 返回顶楼 | |







