我的ORM之七-- 权限
权限范围
权限可以控制以下部分:
- 页面
- 按钮
- 表格列 (未完成)
- 菜单表的行
其中:
页面权限,需要在程序请求之前进行判断。
按钮权限,表格列权限,需要在请求页面之后,通过JavaScript,动态隐藏,如果认为不安全,则再对Post的URL进行权限设置。(web.config/appSetting 设置 TestPostPower 为 true )
菜单表的行,我叫它 行集权限,在进行 ORM 查询时,进行自动过滤,即,查询条件后面追加 id in ( 1,2,3,4)。
设置当前执行上下文
通过使用 MyOqlConfigScope 设置当前线程的上下文,可以控制在当前范围作用域下使用指定权限。
using (var conf = new MyOqlConfigScope(ReConfigEnum.SkipPower)) { //不进行权限过滤,可劲查。 return usr; }
ReConfigEnums是一个MyOql内部枚举,定义如下:
/// <summary> /// 配置MyOql作用域 /// </summary> [Flags] public enum ReConfigEnum { /// <summary> /// 忽略权限验证 /// </summary> SkipPower = 0x1, /// <summary> /// 忽略使用缓存 /// </summary> SkipCache = 0x2, /// <summary> /// 忽略Log /// </summary> SkipLog = 0x4, /// <summary> /// 使用DbName,不进行转义 /// </summary> UseDbName = 0x8, ///// <summary> ///// 不使用列别名 ///// </summary> //IgnoreDbAliasName = 0x16, /// <summary> /// 脏读模式,不读取未提交信息。 /// </summary> ReadPast = 0x20, /// <summary> /// 脏读模式,读取未提交信息 /// </summary> NoLock = 0x40, /// <summary> /// 默认的等待事务完成模式。 /// </summary> WaitLock = 0x80, /// <summary> /// 截断长度存入数据库(插入,更新时) /// </summary> CutLength2Db = 0x100, /// <summary> /// 使用显式ID /// </summary> IdentityInsert = 0x1000, }
项目实现
代码及Demo参考示例项目。
数据库表 S_PowerAction 页面权限元数据,包含以下列:
- ID
- Area 对应Url的第一部分,翻译为 子系统,使业务人员更容易理解
- Controller 对应Url的第二部分,翻译为 模块
- Action 对应Url的第三部分,翻译为页面
- Name 页面的中文表示。
其中 Area,Controller,Action 也对应了 Mvc 的路由,通过三级URL进行权限过滤。这样的好处是,即便是进行了多个URL重写,也绕不过权限校验机制。对于没有定义的URL,则不进行权限校验。
权限还依赖以下表:
- 用户表 P_User
- 角色表 P_SystemRole ,权限是设置到角色的, 该表包含权限字表示
- 用户角色关系表 P_UserRole , 用户所拥有的权限是该用户角色拥有权限的最大集合。
使用方式
- 创建用户
- 创建角色
- 创建用户角色关系
- 创建 页面权限元数据
- 创建 按钮权限元数据
- 把 页面权限设置到角色上
- 把 按钮权限设置到角色上
重新登录可以观察权限效果。
作者:NewSea 出处:http://newsea.cnblogs.com/
QQ,MSN:iamnewsea@hotmail.com 如无特别标记说明,均为NewSea原创,版权私有,翻载必纠。欢迎交流,转载,但要在页面明显位置给出原文连接。谢谢。 |