项目设计,请指正一下。

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



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. }

有这么几个关键点

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

有几个问题:

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

先把这些问题弄清楚。

那么在四色原型里,

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

分析好以后,我们可以从一个测试开始,来看看你到底想实现什么功能 :-)
[该贴被yananay于2007年08月03日 13:22修改过]

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

组和部门的关系是什么呢?
部门我们都知道是一个具体的概念,组是一个抽象的概念还是具体的概念呢?

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

那用户组就是抽象的概念了。

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

这个问题要多了解本站以前讨论的权限角色方面的讨论。

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

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

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

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

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

好吧,用个实例来说更清楚。

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

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

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

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

晕倒5分钟先