设计基础:
用户, 角色, 权限三大核心表, 加上用户角色, 角色权限两个映射表(用于给用户表联系上权限表). 这样就可以通过登录的用户来获取权限列表, 或判断是否拥有某个权限.
大致用到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, 用户信息表:
- 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, 角色表:
- create table role
- (
roleid varchar(50) not null, -- 角色 Id
rolename varchar(100), -- 角色名称
)
alter table tole -- 主键
add constraint pk_role_roleid primary key (roleid)
3, 权限菜单表
- 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, 用户与角色关系表
- 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, 角色与权限关系表
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) -- 主键
6. 五表之间的关联
来源: http://www.bubuko.com/infodetail-2994345.html