一,要解决的问题
说实话,我现在很激动。
做BS系统的朋友,可能深有体会,每做一个新系统,我们都得重头写权限控制代码,而且页个面中,都得加那么一段权限控制的代码,一是费神,再者也不是很幽雅,有没有一只通用的“魔法棒”呢?有,当然有。因为我是一”懒人“,不太喜欢做重复无聊的工作,就在昨天,一不小心就发明了一只“魔法棒”。
二,要预先掌握的知识(要使用“魔法棒”)
因为我是在ASP.NET运行时,也就是http管线中,过滤控制权限的,所以必须先了解IHttpModule,这东西其实不复杂,用白话讲,她就是http管线中的一“插件”,或者叫“筛子”也行。asp.net运行时在处理asp.net资源时,一般都要经过N道“筛子”,最终到达IhttpHandler,所以我们要做的,就是在“筛子”上做文章。(不是很熟悉asp.net运行时环境的朋友,Google一下,资料很多)
三,要澄清的一个概念
一般来讲,权限控制分两类,或者说两级,第一级范围比较大,也就是控制页面的权限,第二级控制得比较细,可以控制到页面中的某个具体的Button,下面来看看第一种情形。
四,魔法棒的特点
1.可配置性,请看配置文件
<appSettings>
<!--随意配置 系统的启动页 -->
<add key="LoinPage" value="Default.aspx"/>
<!--随意配置 需要权限过滤的资源扩展名 -->
<add key="ExeName" value="aspx"/>
<!--随意配置 保存在Session中的用户名称 -->
<add key="UserName" value="UserName"/>
<!--随意配置 保存在Session中的权限文件列表名称 -->
<add key="FileList" value="FileList"/>
<!--随意配置 当权限不够时,要跳转的页面 -->
<add key="NoAuthoredPage" value="NoAuthoredPage.htm"/>
<!--随意配置 查询权限的SQL语句 -->
<add key="SqlStatement" value="select ID,fileName from AuthorFile where userName='{0}'"/>
<!--随意配置 数据库连接字符串 -->
<add key="sqlConnectionString" value="Data Source=localhost;Initial Catalog=Test;User ID=sa;Password=13755002212"/>
</appSettings>
可以看到,我们可以配置很多,就连SQL语句都可以,还可以配置哪些需要进行权限控制的资源等等,忘记加密数据库连接字符串了,请大家不要黑我。
2.超级低偶合,使用此“魔法棒”,只需要配置一行
<httpModules>
<add name="HttpModuleName" type="HttpModule授权.AuthorHttpModule"/>
</httpModules>
太酷了,记得一定要加上,不然“筛子”就成了“竹蓝子”
3.高性能,权限从数据库中获取,并且只有在帐号通过验证,并且是第一次的时候,才查询数据库的权限表,以后直接从内存中取权限列表,避免无谓的开销。
//只有在第一次验证通过,查询数据库,避免不必要的查询开销
if (application.Session["FileList"] == null)
{
dtFile = new Validator().GetCurrUserAuthorFile(userName).Tables[0];
if (dtFile != null)
{
4.权限与系统业务逻辑完全分开
5.高度可定制,可扩展,不说了,大家还是看一下效果
登陆效果
主界面
权限判断
五,迫不及待要做的事情(哈哈)
代码和数据库文件下载
http://files.cnblogs.com/wmj/null_authorDemo.rar
六,结束雨
此“魔法棒”,其实可以更加完善,后面我会继续改进,希望对大家有帮助和启发,谢谢。
七,补充
刚刚有朋友老说,这不是控件级别的权限控制,对,这是页面级别的权限控制,页面级别和控件级别的控制不能混为一谈,后续,我会单独做一个控件级别的控制模块,再者,我会完善不同目录下同文件名的bug。
ASP.NET 运行时 可扩展 可配置 权限控制 模块
最新推荐文章于 2024-08-01 12:05:09 发布