我的ORM之七-- 权限

我的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 , 用户所拥有的权限是该用户角色拥有权限的最大集合。

使用方式

  • 创建用户
  • 创建角色
  • 创建用户角色关系
  • 创建 页面权限元数据
  • 创建 按钮权限元数据
  • 把 页面权限设置到角色上
  • 把 按钮权限设置到角色上

重新登录可以观察权限效果。

上一篇:执行npm run build之后显示空白页面


下一篇:The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar