用户权限设计-小结

      毕业以来一直从事java 开发, 对于每个系统都应该存在的用户权限设计,也算有点心得,所以总结一下,和大家分享一下.

      一般来说,会涉及到三个对象: 用户,角色,权限.  

      用户(employee_ccenter):用来记录用户相关的信息,比如 员工编号(emp_number) 唯一 ,用户id(personId) 唯一, 用户姓名(last_name),邮箱,地址等.

      用户表中有两个唯一列,这是因为我们系统的用户,只需要知道员工编号,就可以了,使用员工编号登录系统,开发人员根据员工编号获取用户的personId,我们在操作表的时候,都使用personId进行存取操作

      角色:没有什么可说的,是分配用户一定的权限的定义词.根据不同公司的实际情况,分为不同的角色,一般来说都会有:系统管理员(adminUser),财务部(finance),项目经理等

      权限:就是用户根据角色获取对某一程序或者功能的操作

     ok,上面说了一大堆概念的话,下面进入主设计吧

      我所操作的用户权限这一块,除了用户表(employee_ccenter),另设计了四张表

          1.菜单表(t_menu)

              字段:

          MENU_ID   integer   (菜单表id)

          MENU_CODE varchar2  (模块标识,如菜单权限模块:Auth)

          MENU_NAME varchar2 (模块名称: 菜单权限)

          PARENT_ID   interger  (父节点,一级菜单 的父节点 为64)

          URL         varchar2         (功能所对应的链接 )

          SEQ_NUMBER  integer  (排序字段)

           IS_FIXED       integer   (标明该功能是可以使用)

         测试数据:

              

         2. 角色表(t_user_role)

            字段:

            ID                        varchar2    (唯一标识)
       ROLE_ID              varchar2   (角色标识,可以看作多余字段)
       ROLE_NAME        varchar2  (角色名称)

         测试数据:

                 

 

          3. 角色-菜单 表(t_role_menu)【即角色对应的菜单配置表】

               字段:

                   ID                                  varchar2               (唯一标识)
      ROLE_ID                       varchar2               (角色表id)
                    MENU_CODE                varchar2               (菜单表 menu_id)

                测试数据

                       

          4.角色人员配置表(t_auth_config) 【添加用户所属的角色对应】

                    字段:

                    ID                                 varchar2     (唯一标识)
         AUTH_CODE                  varchar2     (角色id)
                    PERSON_ID                   varchar2      (用户id)
                    CREATED_BY
         CREATION_DATE
         LAST_UPDATED_BY
        LAST_UPDATE_DATE

 

                  测试数据

                  

 

              呼~,终于把表结构构造好了,下面我们来说一下,怎样获取数据和页面中显示

              

                一边来说,对于公司内部系统,左侧菜单都会做成树状结构,如图:

                         

                      好,我们来说一下逻辑,首先要用户登录,根据personId,获取用户所对应的角色,这就要查询 角色人员配置表了

                       select a.auth_code   from t_auth_config a  where a.person_id='xxxxxxxx'

                     当获取了角色之后,我们就也要查询角色所对应的权限了,

                       selec *  from oms_menu e
              where exists (
                              select 1
                                from oms_role_menu d
                                        where exists (
                                                       select 1
                                                                  from
                                                       (
                                                           select a.auth_code
                                                            from oms_auth_config a
                                                           where a.person_id='xxxxxxxx'
                                          
                                                      ) c where c.auth_code=d.role_id)
                            and d.menu_code=e.menu_id
                      )       

                这个sql就可以获取我们所需的数据了,但是数据并不是按照树形结构来显示,数据显示很混乱,在前台不用获取父节点与其子菜单,如图:

            

                    在这里不得不得提到结构化查询,结构化查询:一个比较复杂的目录树存储到一个表中,常用的语句:

                           select ... from tablename start with 条件1

                  connect by prior 条件2

                  where 条件3;

                     使用这个结构,上面的sql,就可以改为:

 select level,t.* from ( select e.menu_id id,e.menu_name text,e.parent_id pid,e.url,e.seq_number
from t_menu e
where exists (
                select 1
                from t_role_menu d
                where exists (
                                 select 1
                                 from
                                 (
                                       select a.auth_code
                                        from t_auth_config a
                                       where a.person_id='xxxxxxx' 
                                  ) c where c.auth_code=d.role_id)
                  and d.menu_code=e.menu_id
            ) ) t start with t.pid='64' connect by prior id=pid ORDER SIBLINGS BY t.seq_number DESC

查询结果,如图:

    

看到这些数据,就该有个疑问了,为什么可以进行内部排序,这就要提到ORDER SIBLINGS BY排序的含义,去搜一下,经常用到的。这是后台的处理,既然后台数据按照树形结构出来了,前台根据自己公司不同的框架,当然有不同的处理方式了,所以就不多说了

 

 

 

分享一下,希望大家多多点评一下

                                       

             

 

 

 

 

 

 

 

 

 

 

                  

    

posted @ 2014-05-29 11:43  黄观鱼  阅读(431)  评论(0)    收藏  举报