在实际的开发当中,我们经常会涉及到权限访问等问题。在很多开发当中有些程序员喜欢用Request.ServerVariables[“Script_Name”]来得到路径,然后再根据Session中的值来判断有没有访问权限,这种方法不好的地方在于页面的路径不能随意的改变,不然造成的工作量非常的大。
本方法主要是基于
RBAC
(基于角色的访问控制),现写出主要的步骤
1.
创建表(模块表、角色表、角色权限设置表、用户表)
角色表:
TbRole
字段
类型
大小
约束
描述
ModuleID
SMALLINT
主键,不为空
模块编号
ModuleName
VARCHAR
30
唯一,不为空
模块中文名称
ModuleEName
VARCHAR
30
唯一,不为空
模块英文名字
角色表:
TbRole
字段
类型
大小
约束
描述
RoleID
SMALLINT
主键,不为空
角色编号
RoleName
VARCHAR
20
唯一,不为空
角色名称
RoleDesc
VARCHAR
100
角色描述
角色权限设置表:
TbRoleSet
字段
类型
大小
约束
描述
RoleSetID
SMALLINT
主键,不为空
角色设置编号
RoleID
SMALLINT
引用
TbRole
表
角色编号
ModuleID
SMALLINT
引用
TbModule
表
模块编号
用户表:
TbUser
字段
类型
大小
约束
描述
UserName
VARCHAR
20
主键,不为空
用户名
UserPassword
VARCHAR
10
不为空
密码
UserRole SMALLINT 引用TbRole表 角色
模块表是把系统的各个模块写在其中,然后在角色表中加入角色,再通过角色权限设置表把各个角色能访问的权限联系起来。
模块表:
角色表:
角色权限设置表:
从以上我们可以看出,总共有4个模块,两个角色,他们分别具有的权限为:
管理员(浏览、添加、修改、删除) 普通用户(浏览)
添加了角色以后,我们在添加用户时就可以设定角色了
参考图如下:
用户添加:
2. 用户控件
数据库设置好了以后,接下来要想在什么地方进行身份检查
因为整个网站的头应该是相同的,所以我们可以把验证信息放到一个用户控件中,以后只要把用户控件放到相应的网页即可
但是每个网页都是不同的功能模块,我们怎么能保证用户控件能够动态的识别呢?
接下来在用户控件中加入一个模块英文名字的属性

//
模块英文名称

private
string
moduleEName
=
“”
;



/**/
///
<summary>

///
模块英文名称属性

///
</summary>

public
string
ModuleEName



{


set

{moduleEName
=
value;}


get

{
return
moduleEName;}

}
这样的话只要在相应的网页中设置一下用户控件即可实现(注:ModuleEName要和数据库中的模块英文名相同),不设置即代表此页面不需要验证
如:
浏览模块页面:
<
uc1:top
id
=”Top1″
runat
=”server”
ModuleEName
=”ViewBook”></
uc1:top
>
添加模块页面:
<
uc1:top
id
=”Top1″
runat
=”server”
ModuleEName
=”AddBook”></
uc1:top
>
修改模块页面:
<
uc1:top
id
=”Top1″
runat
=”server”
ModuleEName
=”EditBook”></
uc1:top
>
删除模块页面:
<
uc1:top
id
=”Top1″
runat
=”server”
ModuleEName
=”DeleteBook”></
uc1:top
>
3. 身份验证
在用户控件中,只读取到英文模块名是无法判断权限的,所以在登录中,一定要把登录的角色用Session保存下来(如:Session[“UserRole”])
那么,既然可以得到正在登录的用户的角色,也可以得到此模块的名称,那么当然可以到数据库中看是否有权限了
参考代码如下:

private
void
Page_Load(
object
sender, System.EventArgs e)



{

if
(
!
IsPostBack)



{

//
模块名称等于空,代表不需要进行验证

//
只有在模块名称不为空时,才进行权限验证

if
(moduleEName
!=
“”
)



{

//
Session为空,禁止登录,防止非登录用户

if
(Session[
”
UserRole
”
]
==
null
||
Session[
”
UserRole
”
].ToString()
==
“”
)

Response.Redirect(
”
提示页面
”
);


try



{


//
连接数据库

……

//
根据模块英文名称和角色ID进行查选

SqlCommand sqlCmd
=
new
SqlCommand(
”
SELECT RoleSetID FROM TbModule a,TbRoleSet b WHERE

a.ModuleID
=
b.ModuleID AND ModuleEName
=
‘
” + moduleEName + ”
‘
AND RoleID
=
”
+ Session[
”
UserRole
”
].ToString() +
“”
,sqlCon);

sqlCon.Open();


sqlDr
=
sqlCmd.ExecuteReader();


//
返回有记录说明有权限,否则没有权限访问该模块

if
(
!
sqlDr.HasRows)



{

Response.Redirect(
”
提示页面
”
);

}

}


catch

{}

finally



{

//
释放

……


}

}

}

}
