权限无论如何设计,缩小到原子级别,大致是这样的:
key-value,权限编码--对应权限。
实现方式多种多样。但在应用上,却是一致的。即从权限集(通常缓存)中,根据权限的key,判断是否有权限。
有到页面上,也有到页面的具体功能上。
说一下道页面级别的权限应用。
我们的项目是这样设计的。
表1(页面权限编码):
functionId,url
100001,Default.aspx
表2(用户权限)
functionid,userid
100001,1
分配权限时,记录functionid.这样就知道拥有的具体权限。
阶段一、
在每一个页面上,假如权限判断方法。没有权限时,进行相应的处理。当然没有权限的页面不会在菜单中显示的。
毫无疑问,工作量很大,几乎每个页面都需要加入同样的代码。唯一不同的是不同页面的key是不同的。
同时还有一个缺点,key容易写错。往往是复制,修改key。违反了DRY原则。
验证权限方法:HasPermisstion(key)key:权限编码
阶段二、
由于key很容易些错,对方法进行了修改。页面名称作为key,根据页面名去判断权限。而页面名称不需要作为参数传入,少了一个参数。
因此方法改为HasPermisstion()
在函数体内部,可以通过HttpContext获取页面信息。
由阶段一的100001作为查找关键字,变为default.aspx(请求页面地址)
同样每个页面都需要增加验证方法!
阶段三、
使用Ihttpmodule进行权限的控制。
由于需要读取Session,需要继承接口System.Web.SessionState.IRequiresSessionState
在事件AcquireRequestState中进行权限判断,调用HasPermisstion()方法。
克服了前两个阶段的缺点。开发这样一个DLL,在web.config进行配置,即可使用。
想取消时,也非常简单,直接在web.config中删除相应的引用即可。无论怎么更改,不需要重新发布网站。
关于Ihttpmodule请查阅资料。
开发环境: c#2008