发信人: iceant()
整理人: zjxyz(2002-09-10 10:20:42), 站内信件
|
PetStore 1.3.01 权限补充
前几天,PetStore 1.3.1 也来了,修改了一些我一直想改的地方
现在可好,又不用动手了~~(不知道是好事还是坏事!!)
因为我没有看完 PetStore 1.3.1 的 source code,所以不清楚
它对资源保护这一部分有没有做改动?
我暂且将自已的想法说出来,大家看看,给提提意见!
1. PetStore 1.3.01 中的 SignOn component
先说说 PetStore 1.3.01 中的资源保护部分,
PetStore 1.3.01 用了一个叫做 SignOn 的 组件来做资源保护
它大致包括以下几个关键部分
A. EJB 层:
A1. 一个 SignOnLocalEJB
A2. 一个 UserLocalEJB
注:EJB 层负责事务处理,这里就负责校验用户名与密码是否正确
B. 一个 signon-config.xml 配置文件
注:这个配置文件用来说明,哪是登录界面,哪些资源需要保护等信息.
C. WEB 层:
C1. 一个 SignOnFilter
用来做前端过滤,对所有的请求,
C1.1 首先判断用户请求的是否一个受保护的资源
C1.2 再判断用户是否已登录,没有登录就转到登录页(在signon-config.xml里配置),已登录就让用户访问
现在的问题就来了,用户登录了,并不一定表示这个用户就有访问资源的权限啊!!
我希望做的改进,是在这个基础上,判断用户是否有权限访问当前的资源或进行当前的操作!
以下是我的思路:
思路:
1. 权限模型
我对权限模型不是很熟,以下这个是我理解和设计的:
1.1 模型组成成分:
1.1.1 权限(Privilege)
1.1.2 角色(Role)
1.1.3 用户(User)
1.2 关系表
这里是三个部分的相互关系图
+------------------+ +--------------------+
| USER | | PRIVILEGE |
+-----------\------+ +-----/--------------+
* \ / *
\ /
\ /
* \ /*
+---------------------+
| ROLE |
+---------------------+
1.2.1 User 和 Role 是多对多的关系
一个User对应多个 Role;同时,
一个Role可以对应多个User
1.2.2 Role 和 Privilege 是多对多的关系
1.2.3 User 并不直接拥有 Privilege, User 想拥有某种 Privilege
必须归属于某个拥有这个 Privilege 的 Role.
(注:这是为了更好的管理和重用)
1.3 实现
1.3.1 配置文件 privilege-config.xml
这个配置文件主要是用来描述上面所述的各个组成部分的关系.以下是一个例子:
1.3.1.1 USER - ROLE
<privilege-config>
...
<usr-role-map>
<usr id="${user.name.here}">
<role refId="${role.reference.id1.here}"/>
<role refId="${role.reference.id2.here}"/>
...
</usr>
</usr-role-map>
...
</privilege-config>
1.3.1.2 ROLE - PRIVILEGE
<privilege-config>
...
<role-privilege-map>
<role id="${role.name.here}">
<privilege refId="${privilege.reference.id1.here}"/>
<privilege refId="${privilege.reference.id2.here}"/>
...
</usr>
</role-privilege-map>
...
</privilege-config>
1.3.1.3 PRIVILEGE List
<privilege-config>
...
<privilege-list>
...
<privilege id="${privilege.id1.here}">
...
<protected-resource id="PAY.payoff_input.screen" url="payoff_input.screen"/>
<protected-resource id="PAY.payoff.do" url="payoff_input.do"/>
...
</privilege>
...
</privilege-list>
...
</privilege-config>
1.3.1.4 Privilege ID 命名的约束:
因为每个系统都有自己不同的权限名称,在这里我们做一个命名的约束来区分
哪个权限属于哪个系统模块.
建议 Privilege ID 使用 model-name.privilege-name 的格式,即,"模块名.权限名"
1.3.2 构成组件
1.3.2.1 privilege-config.xml 描述 USER - ROLE - PRIVILEGE 关系
1.3.2.2 PrivilegeCheckerFilter 对所有的用户请求进行过滤,
A. 判断当前访问的资源是不是受保护的资源,是就进行B,不是就转到下一个Filter做处理
B. 根据privilege-config.xml中的描述,取拥有当前资源访问的权限ID
C. 从 Session 中取当前登录的 username,然后按 privilege-config.xml 的描述,取当前
用户的PrivilegeList,然后判断B中取得的PrivilegeID 是否包含在 PrivilegeLIst中
C.1 如果是,就让用户访问资源,
C.2 如果否,转到无权限访问的提示页(应该在 privilege-config.xml 里配置)
1.3.3 编码实现
待续...(To be continue...)
---- 看得越多,想得越多,
自已就越渺小
还是好好学习吧 |
|