发信人: 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...)
    
 
  ---- 看得越多,想得越多,
 自已就越渺小
 还是好好学习吧 | 
 
 
 |