关于权限设计的探讨 csdntoll(转贴)
原文:http://expert.csdn.net/Expert/topic/1653/1653829.xml?temp=.2015345
作者: zealberg (冰山)
/************ 权限管理数据库设计**********************
http://expert.csdn.net/Expert/topic/2180/2180181.xml?temp=.5715753
关于权限包容关系通过角色和权限掩码来实现。 /// <summary>
/// 权限保护类型枚举类型。
/// </summary>
public enum ProtectEnum
{
/// <summary>撤回权限保护类型</summary>
RevokeProtect = 0,
/// <summary>授予权限保护类型</summary>
GrantProtect = 1,
/// <summary>拒绝权限保护类型</summary>
DenyProtect = 2
} /// <summary>
/// 系统固定用户或角色枚举类型。
/// </summary>
/// <res>
/// 管理员角色:16399 = 100000000001111
/// 所有者角色:16385 = 100000000000001
/// 只读者角色:16386 = 100000000000010
/// 安全员角色:16388 = 100000000000100
/// 配置员角色:16392 = 100000000001000
/// </res>
public enum FixedRoleEnum
{
///<summary>系统管理员固定用户</summary>
Administrator = 1,
///<summary>系统管理员固定角色</summary>
Administrators = 16399,
///<summary>所有者固定角色(具有读写操作之权限)</summary>
Authors = 16385,
///<summary>只读者固定角色(具有只读操作之权限)</summary>
Readers = 16386,
///<summary>系统安全管理员固定角色</summary>
Security = 16388,
///<summary>系统设置管理员固定角色</summary>
Setting = 16392
} /// <summary>
/// 系统权限枚举类型。
/// </summary>
public enum PermissionEnum
{
/// <summary>“读取”权限</summary>
FetchPermission = 1,
/// <summary>“新增”权限</summary>
AddNewPermission = 2,
/// <summary>“更新”权限</summary>
UpdatePermission = 4,
/// <summary>“删除”权限</summary>
DeletePermission = 8,
/// <summary>“打印”权限</summary>
PrintPermission = 16,
/// <summary>系统保留,应用于流程处理</summary>
FlowPermission = 1024,
/// <summary>系统保留,应用于流程处理</summary>
VoidPermission = 2048
}如果用户“Popeye”对“销售出仓单[2009]”系统对象具有读写(读取+修改+删除+新增)权限:(权限表定义如下TPermission)
FormID UID Permission
======= ==== ==========
2009 Popeye 1+2+4+8=15***** 上面系统定义的默认权限肯定是不够系统使用的,那么还有一些权限(例如:报关系统中的“计算差异表”“制造申报单”等权限,就由系统再定义),其实不用太担心会不够用的,因为在一个Form中不可能会出现所有权限情况,所以,系统自定义的权限掩码可重复使用在不同的表单中。*****建议不要把角色和用户分开两张表来存储(可参考MS-SQL Server中的sys_users表),因为在后面的权限定义表需要引用这个表的UID(其可为用户或角色,SQL中是使用UID的数值范围来区别用户与角色的,建议也如此。),版主说的角色与用户分开对待权限设置,这点我不赞成。因为角色只不过是一种用户组,其应该享用用户的权限定义范围,在其下属的角色成员(注意角色成员不同于用户或角色哦,其可以为角色也可以为用户)均默认继承其定义的权限,除非角色成员重新指派其上级角色定义的权限字。下面给出我的相关表定义:TUser(用户或角色表)
===================
(PK)UID int NOT NULL(主键)
Name nvarchar(50) NOT NULL(唯一性约束)
FullName nvarchar(100) NULL
Description nvarchar(255) NULL
MasterNo varchar(25) NULL(注:该字段对应为员工表中的员工编号,通过该字段就可以关联知道该用户或角色所属的员工了,在企业管理系统中很有用啊!)TMember(用户与角色关系表)
=========================
(*PK)RoleID int NOT NULL
(*PK)UserID int NOT NULLTPermission(用户权限表)
=======================
(*PK)FormID int NOT NULL(表示系统中各个模块或表单的唯一编号)
(*PK)UserID int NOT NULL(用户或角色编号)
Protect bit NOT NULL(1:表示显示授予权限;0:表示显示拒绝权限)
Permission int NOT NULL(权限掩码和)***** 如果哪位兄弟有意研究权限与流程定制方面的东东,相信找偶是没错的了!!!呵呵~~~ 老板,给分啊~~~~~×××××==========================================以上的方法与我做的项目的方法基本一致,现摘一部分的表结构,以供大家参考
create table t_workelement /*工作元素表*/
(
code varchar(20) not null, /*元素的代码,唯一*/
name varchar(50) not null UNIQUE,/*元素的名称,唯一*/
type int not null, /*类型 0-单据操作 1-报表操作 2-功能操作*/
bcode varchar(20) null, /*对应操作的单据\报表\功能的代码*/
style int null, /*单据:类型 0-查看 1-新增 2-修改 3-删除*/
/*报表:无*/
/*功能:无*/
term ntext null, /*单据:查看\修改\删除时要符合的条件,如"{$承揽合同.编号}=12\n{$承揽合同.名称}<>'afd'"*/
primary key(code)
)
go
drop table t_role
go
create table t_role /*角色表*/
(
name varchar(30) not null,
category varchar(50) null,
re varchar(100) null,
primary key(name)
)
go
drop table t_roleelement
go
create table t_roleelement /*角色元素操作表*/
(
rname varchar(30) not null, /*角色名称*/
ecode varchar(20) not null, /*元素的代码*/
primary key(rname,ecode)
)
go
drop table t_users
go
create table t_users /*用户表*/
(
name varchar(20) not null, /*用户的名称*/
dcode varchar(20) not null, /*所属的部门*/
category varchar(50) null, /*用户的类别*/
pswd varchar(15) null, /*密码*/
primary key(name)
)
go
/*插入系统管理员*/
INSERT INTO t_users
(
name,
dcode,
category,
pswd
)
VALUES
(
'Admini',
'system',
'超级用户',
''
)
go
drop table t_userrole
go
create table t_userrole /*用户角色表*/
(
uname varchar(20) not null, /*用户名称*/
rname varchar(30) not null, /*角色的名称*/
primary key(uname,rname)
)
go
INSERT INTO t_userrole
(
uname,
rname
)
VALUES
(
'Admini',
'系统管理员'
)
go
drop table t_dept
go
create table t_dept /*部门表*/
(
code varchar(20) not null, /*部门的代码*/
name varchar(50) not null UNIQUE,/*部门的名称*/
type varchar(10) null, /*部门的类别 行政 仓库 车间*/
subtype varchar(16) null, /*子类别 成品仓库 原料仓库自定义*/
primary key(code)
)
go
/*插入系统管理部*/
INSERT INTO t_dept
(
code,
name,
type
)
VALUES
(
'system',
'系统管理部',
'行政'
)
go
解决方案 »
- 写了个视图,在management studio 中右击视图名--打开视图,结果导致management studio 崩溃,请问是怎么回事?
- sql问题。
- 求助各位大侠!关于如何实现一个往表中插入数据失败的环境~急~
- 这种数据结构,实现移动功能,要怎么实现
- sql2000中有什么办法可以读写本地文件,如文本文件
- 作业所在的系统表
- 字符串转换为日期类型
- 分组求和的一个SQL语句问题,请指教。
- 各位大虾有谁知道什么是"管理参照表数据"啊?
- sql server的序列号
- 用VB開發的應用程式,在同一網域內,有些可以登錄,有些又提示登錄timeout,根本連不上后台數據庫,在線等待。
- 班主,进来讨论一下:简繁体转换与显示问题???UP有分。
--*/CREATE TABLE 功能 (
id int IDENTITY (1, 1),
功能名称 nvarchar (50),
parentid int
)
GOCREATE TABLE 用户 (
id int IDENTITY (1, 1) NOT NULL,
用户名 nvarchar (50),
密码 nvarchar (50),
修改日期 datetime,
起始日期 datetime
)
GOCREATE TABLE 权限 (
id int IDENTITY (1, 1) NOT NULL,
用户ID int,
功能id int,
操作权限,
)
GO--数据
--软件的功能分类
insert into 功能
select '产品销售',0
union all select '电器',1
union all select '食品类',1
union all select '日常用品',1
union all select '家电',2
union all select '电脑',2--用户
insert into 用户
select '张三',null,getdate(),getdate()
union all select '李四',null,getdate(),getdate()--权限分配,假设每个功能都有这样的权限设置:1.新增/2.修改/3.删除/4.打印
insert into 权限
select 1,2,power(2,1)+power(2,2)+power(2,4) --张三具有电器类的1.新增/2.修改/4.打印的功能
select 1,4,power(2,1)+power(2,2) --张三具有日常用品类的1.新增/2.修改的功能
select 2,1,power(2,1)+power(2,2)+power(2,3)+power(2,4) --李四具有所有权限