精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Java>>J2EE>>PetStore 1.3.01 权限补充

主题:PetStore 1.3.01 权限补充
发信人: 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...)
   


----
看得越多,想得越多,
自已就越渺小
还是好好学习吧

[关闭][返回]