权限管理系统(四)

背景

多数企业应用都需要对数据权限进行控制,如:某个用户只能看到某个范围的数据(数据行)、某个用户只能看到某几列数据(数据列)。本文以数据行级别的权限控制为范例,谈谈如何设计权限模型和查询 API。

权限模型

结合自己的项目需求,可以省略掉“数据角色”,直接让“用户”聚合“数据权限”,也可以只保留一个“角色”,让“角色”聚合“操作权限”和“数据权限”。

可扩展的数据权限模型

伪代码示例

复制代码
 1     class SessionInfo
 2     {
 3         public Guid UserId { get; set; }
 4 
 5         public Guid DepartmentId { get; set; }
 6     }
 7 
 8     interface IDataPermissionProvider
 9     {
10         string CreateSQL(SessionInfo sessionInfo, Dictionary<string, object> args);
11     }
12 
13     [DisplayName("我的")]
14     class DepartmentDataPermissionProvider : IDataPermissionProvider
15     {
16         public string CreateSQL(SessionInfo sessionInfo, Dictionary<string, object> args)
17         {
18             return String.Format("( CreateUserId = '{0}' )", sessionInfo.UserId);
19         }
20     }
21 
22     [DisplayName("指定部门")]
23     class MySelfDataPermissionProvider : IDataPermissionProvider
24     {
25         public string CreateSQL(SessionInfo sessionInfo, Dictionary<string, object> args)
26         {
27             return String.Format("( DepartmentId = '{0}' )", args["DepartmentId"]);
28         }
29     }
复制代码

草图示例

说明

很容易将这部分“插件化”,如支持“自定义”,然后显示一个输入框,可以输入:“Price > 130”。

如何设计查询API?

先看两个用例

上面两个用例,对订单有两种查询需求,我们如何设计这种查询 API 呢?

  1. 第一种:
    复制代码
    1     class QueryService
    2     {
    3         public QueryResult Query(UserCase userCase, DynamicQuery query)
    4         {
    5             // 根据 userCase 决定是否或如何动态的追加数据权限。
    6             return null;
    7         }
    8     }
    复制代码

    需要根据不同的 UserCase,决定是否追加数据权限,如:A 用例需要数据权限,B 用例不需要,UserCase 可能是“当前请求的模块名字”或“当前请求的URL”。

  2. 第二种:
    复制代码
        class QueryService
        {
            public QueryResult QueryA(DynamicQuery query)
            {
                return null;
            }
    
            public QueryResult QueryB(DynamicQuery query)
            {
                return null;
            }
        }
    复制代码

    我更喜欢这种风格。

上面的 DynamicQuery 并不是“万能的查询条件”,而是满足某一用例的不同查询组合的一种“规约”,很多系统都提供“万能查询”,也算是一种特殊的“规约”了。

另外需要注意的是:一个用例会有多种查询需求的(或者叫查询组合)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值