权限系统设计五张表

  设计基础:用户、角色、权限三大核心表,加上用户角色、角色权限两个映射表(用于给用户表联系上权限表)。这样就可以通过登录的用户来获取权限列表,或判断是否拥有某个权限。

  大致用到5张表:用户表(UserInfo)、角色表(RoleInfo)、菜单表(MenuInfo)、用户角色表(UserRole)、角色菜单表(RoleMenu)。

各表的大体表结构如下:

  1、用户表(UserInfo):Id、UserName、UserPwd

  2、角色表(RoleInfo):Id、RoleName

  3、菜单表(MenuInfo):Id、MenuName

  4、用户角色表(UserRole):Id、UserId、RoleId

  5、角色菜单表(RoleMenu):Id、RoleId、MenuId

  最关键的地方是,某个用户登录时,如何查找该用户的菜单权限?其实一条语句即可搞定:

  假如用户的用户名为Arthur,则他的菜单权限查询如下:

  Select m.Id,m.MenuName from MenuInfo m ,UserInfo u, UserRole ur, RoleMenu rm Where m.Id = rm.MenuId and ur.RoleId = rm.RoleId and ur.UserId = u.Id and u.UserName = ‘Arthur‘

  任何权限的需求,都是为广义的用户分配角色,角色拥有广义的权限。角色是最重要的中枢,隐藏做幕后黑手,从不出现在业务代码里,用行话说就是解除了用户和权限的直接耦合。

  角色把用户抽象化了,几百个用户变成成几个角色,用户->角色->权限写成通用判断权限的方法:currUser.IsHave(xx权限)。核心就是一个sql联表查询语句,查询条件为用户id。

例如:
部门权限:部门也是一种用户,建立 部门表、部门角色表。通用权限方法里加上 当前部门->部门所属角色->权限 
职位权限:职位也是一种用户,建立职位表、职位角色表,同上
菜单:也是一种权限,建立 菜单表、角色菜单表,就把菜单纳入了权限管理。通用权限方法里加上 角色列表->权限、菜单

使用Microsoft SQL Server应用代码构建如下:

1、用户信息表:


1

2

3

4

5

6

7

8

9

10

11

12

create table employee 

   userid varchar(50) not null,  ---用户ID 

   username varchar(100),    ---用户名 

   userpassword varchar(100), ---密码 

   .. 

   .. 

   .. 

   .. 

alter table employee        --主键 

add constraint pk_employee_userid primary key (userid)

 2、角色表:


1

2

3

4

5

6

7

create table role 

  roleid varchar(50) not null--角色Id 

  rolename varchar(100),        --角色名称 

alter table tole     --主键 

add constraint pk_role_roleid primary key (roleid)

  3、权限菜单表 


1

2

3

4

5

6

7

8

9

10

11

create table popedom 

  popedomid int identity(1,1) not null--权限Id 

  popedomname varchar(100), --权限名称 

  popedomfatherid int,      --权限父ID 

  popedomurl varchar(100)   --树的连接路径 

  .. 

  .. 

) 

er table popedom       --主键 

add constraint PK_popedom primary key (popedomid)  

  添加数据如
insert into popedom values(‘我的办公桌‘,0,‘‘)
insert into popedom values(‘电子邮箱‘,1,‘../mail/EmaiolManage.aspx‘)
(添加数据的原则是一级接点的popedomfatherid 为0,如果是(我的办公桌)下面的接点,它们的popedomfatherid为(我的办公桌)的主键)

4、用户与角色关系表


1

2

3

4

5

6

7

8

create table user_role 

 connectionid int identity(1,1) not null--关系ID 

  userid varchar(50) not null,   --管理员表ID 

  roleid varchar(50) not null   --角色Id 

alter table user_role    --主键 

add constraint PK_admin_role primary key(connectionid)  

  5、角色与权限关系表


1

2

3

4

5

6

7

8

9

create table role_popedom     --角色与权限表 

  connectionid int identity(1,1), --关系Id 

  roleid varchar(50) not null,      --角色ID 

  popedomid int not null,   --权限Id 

  popedom    int   --权限 (1为可用,2为不可用) 

alter table role_popedom       --主键 

add constraint PK_role_popedom primary key(connectionid) --主键 

原文地址:https://www.cnblogs.com/lijun6/p/11193990.html

时间: 2024-11-04 09:49:02

权限系统设计五张表的相关文章

经典角色权限系统设计五张表及拓展应用

设计基础:用户.角色.权限三大核心表,加上用户角色.角色权限两个映射表(用于给用户表联系上权限表).这样就可以通过登录的用户来获取权限列表,或判断是否拥有某个权限. 大致用到5张表:用户表(UserInfo).角色表(RoleInfo).菜单表(MenuInfo).用户角色表(UserRole).角色菜单表(RoleMenu). 各表的大体表结构如下: 1.用户表(UserInfo):Id.UserName.UserPwd 2.角色表(RoleInfo):Id.RoleName 3.菜单表(Me

ASP.NET-权限管理五张表

ASP.NET 权限管理五张表 权限管理的表(5张表) 每个表里面必有的一些信息 序号 名称  字段  类型   主键 默认值 是否为空 备注 1  用户ID  ID      INT     是  null    否 用户ID 2 用户名称 UserName varchar(100) 否 null 否 用户名称 3 用户密码 UserPassword varchar(20) 否 null 否 用户密码 4 状态 Status smallint 否 null 否 有效1,无效0 5 创建人 Cr

第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表、课程机构表、讲师表

第三百七十五节,Django+Xadmin打造上线标准的在线教育平台-创建课程机构app,在models.py文件生成3张表,城市表.课程机构表.讲师表 创建名称为app_organization的课程机构APP,写数据库操作文件models.py models.py文件 #!/usr/bin/env python # -*- coding:utf-8 -*- from __future__ import unicode_literals from datetime import datetim

oracle中查询所有外键引用到某张表的记录

其实查找这篇文章  我主要用的sql 是这句  select * from user_cons_columns t where t.constraint_name like 'FK_CTS_CONT_REINS__CRR'; 起因: 系统测试的时候发现如果某条记录已经被引用了,这个时候删除这条记录会引起数据不一致,系统会报错.比如警员信息,在考勤记录表里会引用警员ID,如果考勤记录表中已经存在这个警员ID了,这时从警员表中删除该警员,就会引起数据不一致,前台报错.所以,这个时候我就想查找数据库中

如何将多个查询结果拼成一张表

有以下几个查询结果,想要拼成一张表 1.SELECT NAME,COUNT(1) AS Num1 FROM 表1 GROUP BY NAME; 2.SELECT NAME,COUNT(1) AS Num2 FROM 表1 WHERE EXC= 0 GROUP BY NAME; 注:EXC数据类型为bit 3.SELECT NAME,COUNT(1)AS Num3 FROM 表2 GROUP BY NAME; 4.SELECT NAME,COUNT(1)AS Num4 FROM 表2 WHERE

查询MySQL中某个数据库中有多少张表

SELECT COUNT(*) TABLES, table_schema FROM information_schema.TABLES   WHERE table_schema = '数据库' GROUP BY table_schema; 这还是头一次接触information_schema这个数据库, information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式.什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等.有些时候用于表

java权限系统设计篇

数据库表设计 1.1.1.   模块管理(jk_module) 项 类型 说明 id long 就是数据库记录idx号 name string 模块名称 orderid int 排序id  由小到大显示 deleted int 默认0 (0 正常  1删除状态) 1.1.2.   模块功能管理(jk_module_fun) 项 类型 说明 id long 就是数据库记录idx号 moduleid long 所属模块 name string 功能名称 urls string 功能url集合 ord

SQLSERVER中如何快速比较两张表的不一样

一般来说,如何检测两张表的内容是否一致,体现在复制的时候发布端和订阅端的两端的数据上面 我这里罗列了一些如何从数据库层面来解决此类问题的方法 第一步当然就是检查记录数是否一致,否则不用想其他方法了~这里我们用两张表t1_old,t1_new来演示 方法介绍 方法一:老老实实看表结构和表记录数,弊端是根本看不到两张表的数据是否一致,只是看到表结构和记录数是否一致 --表结构: CREATE TABLE t1_old ( id int NOT NULL, log_time DATETIME DEFA

excel两张表筛选取数据

为了保证两张表数据不重复,请确保你的原数据表参考的字段无重复(如表一中姓名无重复,那么表二中便可用姓名作为查找条件). 但你的表数据700条不可能出现不重复现象,所以,你的表里面最好能有一个可以作为唯一标识的字段,如工号.ID.编号等.你在自己表中操作时,将你参考的字段与本文档里我用的姓名替换即可. 表一:sheet1=700人总表 表二:sheet2=200人花名册表 需求:表一中的工资数据取到表二对应的人名工资列中 操作: 1.选择sheet2表中,第一行人名:张一 对应的工资一的第一个单元