项目设计,请指正一下。

07-08-02 wlmouse
这是公司最近做的一个项目的一个子项目。要求用这个统一管理项目的用户角色权限。
我看了别人的设计的ER图(只有ER图,没有对象),一头雾水。因为设个设计涉密,就不在此说了。我只把我自己的设计拿出来,希望指正。
有部门、用户、用户组、角色和资源这几个对象。用户属于部门。部分用户同时属于某用户组。角色管理资源。
要求是当用户登录后,以不同的角色管理时,可以管理不同的部门。
假设角色有两个(全局管理员和部门管理员),要求A用户属于B部门,当A用户以全局管理员登录时,可以管理C部门。以部门管理员管理时,管理B部门。D用户属于E部门,但是属于F用户组,权限规定,当F用户组的用户可以在全局管理员身份登录时,管理C部门,以部门管理员登录时,管理B部门。
我写了几个对象的最简单的类代码(只有这几个类的引用和权限切换代码)。希望指正一下。这么写如何?在用Hibernate好实现吗?
在JavaEye放了半天没人理,转发到这里。我刚刚发现,我这个设计有一个前提,同一条件下,一个用户只能管理一个部门。如果同时管理两个部门,我这个设计就不成了。Map是一对一的键值对。代码比较多,放到下一贴了。

s and Settings-WangLei-My Docum0001.rar


wlmouse
2007-08-02 22:38
   1. /** 
   2.  * 角色 
   3.  */  
   4. public class Role {  
   5.     //角色当前用户  
   6.     private User nowUser;  
   7.     //角色使用的资源列表  
   8.     private List<Source> sourceList;  
   9.     //角色用户列表  
  10.     private List<User> userList;  
  11.     //角色用户组列表  
  12.     private List<UserGroup> userGroupList;  
  13.     //角色在不同用户下,能管理的部门的关系Map  
  14.     private Map<User,Department> map;    
  16.     /** Creates a new instance of Role */  
  17.     public Role() {  
  18.     }  
  20.     /** 
  21.      * 得到当前角色的用户 
  22.      */  
  23.     public User getNowUser() {  
  24.         return nowUser;  
  25.     }  
  27.     /** 
  28.      * 设置角色当前用户但是角色必须在用户列表和用户组列表中 
  29.      */  
  30.     public void setNowUser(User nowUser) {  
  31.         if (userList.indexOf(nowUser)>-1){  
  32.             this.nowUser = nowUser;  
  33.         } else {  
  34.             for(UserGroup ug:userGroupList){  
  35.                 List<User> tmpList=ug.getUserList();  
  36.                 if (tmpList.indexOf(nowUser)>-1){  
  37.                     this.nowUser = nowUser;  
  38.                 }  
  39.             }  
  40.         }  
  41.     }  
  43.     /** 
  44.      * 得到当前角色所管理的部门 
  45.      */  
  46.     public Department getScope(){  
  47.         if (nowUser != null) {  
  48.             return map.get(nowUser);  
  49.         } else {  
  50.             return null;  
  51.         }  
  52.     }  
  53. }  
  55. /** 
  56.  * 用户 
  57.  */  
  58. public class User {  
  59.     //当前用户角色  
  60.     private Role nowRole;  
  61.     //用户所属部门列表  
  62.     private List<Department> departmentList;  
  63.     //用户所属用户组列表  
  64.     private List<UserGroup> user;  
  65.     //用户拥有角色列表  
  66.     private List<Role> roleList;  
  67.     //用户在不同角色下,能管理的部门的关系Map  
  68.     private Map<Role,Department> map;  
  70.     /** Creates a new instance of User */  
  71.     public User() {  
  72.     }  
  74.     /** 
  75.      * 得到当前用户所管理的部门 
  76.      */  
  77.     public Department getScope(){  
  78.         if (nowRole != null) {  
  79.             return map.get(nowRole);  
  80.         } else {  
  81.             return null;  
  82.         }  
  83.     }  
  85.     /** 
  86.      * 得到当前用户的角色 
  87.      */  
  88.     public Role getNowRole() {  
  89.         return nowRole;  
  90.     }  
  92.     /** 
  93.      * 设置用户当前角色,但是角色必须在用户角色列表中 
  94.      */  
  95.     public void setNowRole(Role nowRole) {  
  96.         if (roleList.indexOf(nowRole) > -1) {  
  97.             this.nowRole = nowRole;  
  98.         }  
  99.     }     
 100. }  
 102. /** 
 104.  * 部门 
 105.  */  
 106. public class Department {  
 108.     private List<User> userList;  
 110.     /** Creates a new instance of Department */  
 111.     public Department() {  
 112.     }     
 113. }  
 115. /** 
 116.  * 资源 
 117.  */  
 118. public class Source {  
 120.     private List<Role> RoleList;  
 122.     private List<Menu> menuList;  
 124.     /** Creates a new instance of Source */  
 125.     public Source() {  
 126.     }     
 127. }  
 129. /** 
 130.  * 用户组 
 131.  */  
 132. public class UserGroup {  
 134.     private List<User> userList;  
 136.     private List<Role> roleList;  
 138.     /** Creates a new instance of UserGroup */  
 139.     public UserGroup() {  
 140.     }  
 142.     public List<User> getUserList() {  
 143.         return userList;  
 144.     }  
 146.     public void setUserList(List<User> userList) {  
 147.         this.userList = userList;  
 148.     }  
 149. }  
<p class="indent">

yananay
2007-08-03 13:16
有这么几个关键点

部门、用户、用户组 角色和资源

有几个问题:

1、资源 是什么呢?是个什么概念?
2、一个用户可以分配不同的角色,对吧?
3、一个用户只能属于一个部门?
4、一个用户可以属于多个用户组?
5、对于终端用户来说,所面对的就是“角色”吧?
6、权限检查的规则就是如果角色属于一个组,那么按照组的权限来检查,
否则就按照角色本身具有的权限来检查?

先把这些问题弄清楚。

那么在四色原型里,

角色似乎就是 Role
部门、用户、用户组 则是 PPT
资源是什么?我没看明白

分析好以后,我们可以从一个测试开始,来看看你到底想实现什么功能 :-)

[该贴被yananay于2007年08月03日 13:22修改过]

wlmouse
2007-08-04 21:17
可能是我说得不太清楚吧。
是这样的。首先,一个用户可以属于多个部门,一个用户可以属于多个组,也可以不属于任何组。资源就是用户的功能权限,比如添加新闻条目、管理人员信息之类的。
这个项目是用来统一配置其他项目的用户权限的。
目的是用户登录后,可以因自己的角色不同而对某一部门进行浏览。比如浏览这个部门的人员信息。但是换一个角色,就可能能对同一个部门做些管理,比如添加、修改人员信息。再换一个角色,那么就只能处理另一个部门了。
就是这么个东西。
以前是如果某人X只能管理A部门,那么就在A部门下配置一个管理员角色,然后把这个角色配置给X。如果X现在又必须管理B部门,那么就又要在B部门下配置角色,然后再配置给X。造成角色泛滥。所以现在只对角色配置权限,把角色、人员和部门之间的关系用其他方式处理,以减少角色太多造成的管理混乱。

yananay
2007-08-06 09:31
组和部门的关系是什么呢?
部门我们都知道是一个具体的概念,组是一个抽象的概念还是具体的概念呢?

wlmouse
2007-08-06 13:57
组就是用户组。如果用户属于某个用户组,然后给用户组赋予角色的话,就相当于给用户组下所有的用户赋予了这个角色。可以设定这个用户组在哪个角色下可以管理哪个部门。

yananay
2007-08-08 09:20
那用户组就是抽象的概念了。

那么用户组的权限和用户的权限是如何组合的呢?
是合并所有权限,还是取最高权限,还是以某一个为准?

banq
2007-08-08 10:52
这个问题要多了解本站以前讨论的权限角色方面的讨论。

特别是RBAC中的角色概念要好好理解一下。

我的观点:用户 --->角色 ---->权限。

角色概念提出是解耦用户和权限之间的直接联系。

下面问题就是用户组和部门属于哪个方面,属于用户这个方面,至于你将用户和用户组和部门形成树形结构,还是并列结构,这个取决于你具体设计。

wlmouse
2007-08-08 14:39
没什么组合的。因为用户组是赋予用户一个角色,如果用户有其他角色的话。可以相互切换。根据角色的切换,来处理权限。

yananay
2007-08-09 08:56
好吧,用个实例来说更清楚。

假设我们有一个 Tom 这个用户。

他具有 department_manager 这个角色。
同时这个用户属于 market_manager_group 这个组。

那么问题就是:
Tom 这个用户,具有的权限是
department_manager权限+market_manager_group 权限呢?
还是
MAX(department_manager权限, market_manager_group 权限) 呢?
还是
MIN(department_manager权限, market_manager_group 权限) 呢?

wlmouse
2007-08-17 11:34
今天又仔细看了需求和网页模型。发现原来用户组只是起个批量添加用户和角色关系的作用。也就是说,可以一次把一个用户组的用户和角色关联起来。用户组和角色没有直接关系。
流程是,读用户组,取出用户组的所有用户,把这些用户和角色关联。

yananay
2007-08-17 13:12
晕倒5分钟先

猜你喜欢