自定义用户访问权限

  • Post author:
  • Post category:其他



在实际的开发当中,我们经常会涉及到权限访问等问题。在很多开发当中有些程序员喜欢用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









{





//


释放






……




}





}





}





}






http://cj.cnblogs.com/archive/2006/06/09/421353.html