背景

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

权限模型

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

可扩展的数据权限模型

伪代码示例

     class SessionInfo
{
public Guid UserId { get; set; } public Guid DepartmentId { get; set; }
} interface IDataPermissionProvider
{
string CreateSQL(SessionInfo sessionInfo, Dictionary<string, object> args);
} [DisplayName("我的")]
class DepartmentDataPermissionProvider : IDataPermissionProvider
{
public string CreateSQL(SessionInfo sessionInfo, Dictionary<string, object> args)
{
return String.Format("( CreateUserId = '{0}' )", sessionInfo.UserId);
}
} [DisplayName("指定部门")]
class MySelfDataPermissionProvider : IDataPermissionProvider
{
public string CreateSQL(SessionInfo sessionInfo, Dictionary<string, object> args)
{
return String.Format("( DepartmentId = '{0}' )", args["DepartmentId"]);
}
}

草图示例

说明

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

如何设计查询API?

先看两个用例

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

  1. 第一种:

         class QueryService
    {
    public QueryResult Query(UserCase userCase, DynamicQuery query)
    {
    // 根据 userCase 决定是否或如何动态的追加数据权限。
    return null;
    }
    }

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

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

    我更喜欢这种风格。

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

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

备注

仓促成文,有这方面经验的朋友请留言批评。

企业应用:浅谈 “数据权限” 和 查询 API 设计的更多相关文章

  1. 【ASP.NET MVC系列】浅谈数据注解和验证

    [ASP.NET MVC系列]浅谈数据注解和验证   [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google C ...

  2. Python Web 基础向(四) 浅谈数据层

    数据层一般会给人带来一些困扰,在于其定位不准确.聚合Model的工作也可以放在逻辑层做,但会导致逻辑层变重,经常出现大段晦涩代码.因此我的建议是保留Model聚合层,尽管会导致工作量的略微增加,但却可 ...

  3. 浅谈iOS中MVVM的架构设计与团队协作

    说到架构设计和团队协作,这个对App的开发还是比较重要的.即使作为一个专业的搬砖者,前提是你这砖搬完放在哪?不只是Code有框架,其他的东西都是有框架的,比如桥梁等等神马的~在这儿就不往外扯了.一个好 ...

  4. IOS中 浅谈iOS中MVVM的架构设计与团队协作

    今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  5. 浅谈iOS中MVVM的架构设计与团队协作【转载】

    今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  6. [PHP] 浅谈 Laravel Authentication 的 auth:api

    auth:api 在 Laravel 的 Routing , Middleware , API Authentication 主题中都有出现. 一. 在 Routing 部分可以知道 auth:api ...

  7. 数据层的多租户浅谈(SAAS多租户数据库设计)

    在上一篇“浅析多租户在 Java 平台和某些 PaaS 上的实现”中我们谈到了应用层面的多租户架构,涉及到 PaaS.JVM.OS 等,与之相应的是数据层也有多租户的支持. 数据层的多租户综述 多租户 ...

  8. [转载]数据层的多租户浅谈(SAAS多租户数据库设计)

    原文:http://www.ibm.com/developerworks/cn/java/j-lo-dataMultitenant/index.html 在上一篇“浅析多租户在 Java 平台和某些 ...

  9. 浅谈mysql权限

    一.      背景: “去IOE”的本质是“分布式+开源”架构替代“集中式+封闭”架构,变成彻底的云计算服务模式.去“IE”易,并且应该去,关键确实能省钱,而且运维难度不大,替代技术产品成熟.而去O ...

随机推荐

  1. jenkins+docker持续集成实验

    在互联网时代,对于每一家公司,软件开发和发布的重要性不言而喻,目前已经形成一套标准的流程,最重要的组成部分就是持续集成(CI)及持续部署.交付(CD).本文基于Jenkins+Docker+Git实现 ...

  2. 深度揭秘阿里移动端高性能动态化方案Weex

    2016年Qcon大会首日,阿里巴巴资深总监.淘宝移动平台.阿里百川负责人庄卓然宣布移动端高性能动态化方案Weex即时内测,并将于6月开源.此消息一出,群情汹涌,在座的程序猿.攻城狮们纷纷拿起手机扫码 ...

  3. [tensorflow]的安装

    1 pip install 最简单直接的方法,通过pip install安装,命令如下: pip install tensorflow-gpu //安装gpu版tensorflow pip insta ...

  4. cocos2dx 开发配置的一些环境变量(mac/linux)

    通常开发需要配置一些环境变量,下面把我电脑的部分配置分析一下. 1.android开发配置,ndk,sdk,ant 2.cocos2dx开发配置,cocos2d-x export COCOS2DX_R ...

  5. tornado中的cookie

    1. cookie与session的区别: Session:通过在服务器端记录用户信息从而来确认用户身份,保存在服务器上,每个用户会话都有一个对应的session Cookie:通过在客户端记录信息确 ...

  6. C++ 实现的一个打印日历程序

    C++ 实现的一个打印日历程序 说明:总共有三个文件 1.month.h 为定义函数的头文件 2.month.cpp 为函数的实现代码 3.mainprog.cpp 为主函数的实现代码 month.h ...

  7. 【.NET】学习SQLite(1)

    前沿 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存 ...

  8. 【WPF】生成二维码

    第一步,下载Google的ZXing类库,以便引用: BitMatrix bitMatrix; private void Button_Click_1(object sender, RoutedEve ...

  9. 【Sql Server】Sql语句整理

    use Person <--添加约束--> Alter table Student alter column Sno ) not null; Alter table Student Add ...

  10. CodeForces 785C Anton and Fairy Tale

    二分. 如果$n≤m$,显然只能$n$天. 如果$n>m$,至少可以$m$天,剩余还可以支撑多少天,可以二分计算得到,也可以推公式.二分计算的话可能爆$long$ $long$,上了个$Java ...