论坛首页 Java版 企业应用

设计一种简单高效的权限控制

浏览 3244 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-04-05 关键字: 权限
现需要一个权限控制系统,有一个Admin,Admin有所有权限,其下有若干一级管理员,一级管理员拥有大部分权限,但除了功能上受到限制外,区域上也受到限制,比如有ABCDE 5个地区,一级管理员甲负责A,B,C;一级管理员乙负责D,E一个地区只有一个一级管理员,管理员之下还有二级管理员,二级管理员的地区由他的上级分配,功能也比上级少一些,一个二级管理员只能负责一个地区,而一个地区可以有多个二级管理员。另外Admin可以新增权限组,并指定该组的上级

想想如何实现,希望与数据库耦合低些
   
最后更新时间:2007-04-05
和liferay portal的权限管理像的很啊!!
模型设计可以使用
action+resource
action是功能,resource是被操作的对象。每类resource有一组对应的action。每个resource的实例都有一个scope。

将多个action+resource category+scope组合起来成为一个role,就是你要的xxx管理员了。
不过scope逻辑上是树状结构,实现时刻可能用到递归。
   
0 请登录后投票
最后更新时间:2007-04-05
我通常会设计为2种方式

1:用户id对应权限枚举!
用户表和权限表一一对应,id是外键
对于特殊业务(需要被控制起来的)全部写事务,然后编号写到到权限表中。



2:用户表继承权限用户表
一个用户只能存在在一个表中,一旦用户拥有了特殊权限就移动要权限用户表,然后在与权限枚举匹配
   
0 请登录后投票
最后更新时间:2007-04-05
可以用RBAC的权限模型,将scope和功能权限都作为资源赋给角色。比较特殊的是scope自己要在内存中维持一个树形的结构,在授权的时候可以选择拥有权限的子节点。
   
0 请登录后投票
最后更新时间:2007-04-05
关于楼上RBAC的模型方式,能否详细些说,如果在内存中维护一个树形结构,如果增加权限组或者修改权限组时,会否对正在操作的管理员造成一些不可预料的情况
   
0 请登录后投票
最后更新时间: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才能定义一个许可。
   
0 请登录后投票
最后更新时间:2007-04-05
jessdy 写道
关于楼上RBAC的模型方式,能否详细些说,如果在内存中维护一个树形结构,如果增加权限组或者修改权限组时,会否对正在操作的管理员造成一些不可预料的情况

我采用的方法是在缓存中构建树形结构,树节点本身实现deepClone。每一个用户登录后按照赋予他的scope权限,通过filter从缓存中deepClone(API : deepClone(Filter filter))他的scope部分,存储在他的threadLoacal中。
修改scope权限后更新缓存中的scope结构,正在操作的管理员是不会产生影响的。如果想要动态更新操作者的权限可以通过记录thread和filter的关系,当缓存中的树形结构发生变化时,同时将新的deepClone后的scope分发给操作者的线程。
   
0 请登录后投票
最后更新时间: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。
   
0 请登录后投票
最后更新时间:2007-04-05
呵呵,推荐使用LDAP服务器,用户管理权限控制都是非常方便的
   
0 请登录后投票
最后更新时间:2007-04-05
Scope和resource合起来决定一个Resource。实际上是action和Resource,跟Scope没什么关系,Scope只是Resource的一个属性。
   
0 请登录后投票
论坛首页 Java版 企业应用

跳转论坛:
JavaEye推荐