用户权限设计-小结
毕业以来一直从事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排序的含义,去搜一下,经常用到的。这是后台的处理,既然后台数据按照树形结构出来了,前台根据自己公司不同的框架,当然有不同的处理方式了,所以就不多说了
分享一下,希望大家多多点评一下

浙公网安备 33010602011771号