企业应用:浅谈 “数据权限” 和 查询 API 设计
背景
多数企业应用都需要对数据权限进行控制,如:某个用户只能看到某个范围的数据(数据行)、某个用户只能看到某几列数据(数据列)。本文以数据行级别的权限控制为范例,谈谈如何设计权限模型和查询 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 呢?
- 第一种:
class QueryService
{
public QueryResult Query(UserCase userCase, DynamicQuery query)
{
// 根据 userCase 决定是否或如何动态的追加数据权限。
return null;
}
}需要根据不同的 UserCase,决定是否追加数据权限,如:A 用例需要数据权限,B 用例不需要,UserCase 可能是“当前请求的模块名字”或“当前请求的URL”。
- 第二种:
class QueryService
{
public QueryResult QueryA(DynamicQuery query)
{
return null;
} public QueryResult QueryB(DynamicQuery query)
{
return null;
}
}我更喜欢这种风格。
上面的 DynamicQuery 并不是“万能的查询条件”,而是满足某一用例的不同查询组合的一种“规约”,很多系统都提供“万能查询”,也算是一种特殊的“规约”了。
另外需要注意的是:一个用例会有多种查询需求的(或者叫查询组合)。
备注
仓促成文,有这方面经验的朋友请留言批评。
企业应用:浅谈 “数据权限” 和 查询 API 设计的更多相关文章
- 【ASP.NET MVC系列】浅谈数据注解和验证
[ASP.NET MVC系列]浅谈数据注解和验证 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google C ...
- Python Web 基础向(四) 浅谈数据层
数据层一般会给人带来一些困扰,在于其定位不准确.聚合Model的工作也可以放在逻辑层做,但会导致逻辑层变重,经常出现大段晦涩代码.因此我的建议是保留Model聚合层,尽管会导致工作量的略微增加,但却可 ...
- 浅谈iOS中MVVM的架构设计与团队协作
说到架构设计和团队协作,这个对App的开发还是比较重要的.即使作为一个专业的搬砖者,前提是你这砖搬完放在哪?不只是Code有框架,其他的东西都是有框架的,比如桥梁等等神马的~在这儿就不往外扯了.一个好 ...
- IOS中 浅谈iOS中MVVM的架构设计与团队协作
今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 浅谈iOS中MVVM的架构设计与团队协作【转载】
今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- [PHP] 浅谈 Laravel Authentication 的 auth:api
auth:api 在 Laravel 的 Routing , Middleware , API Authentication 主题中都有出现. 一. 在 Routing 部分可以知道 auth:api ...
- 数据层的多租户浅谈(SAAS多租户数据库设计)
在上一篇“浅析多租户在 Java 平台和某些 PaaS 上的实现”中我们谈到了应用层面的多租户架构,涉及到 PaaS.JVM.OS 等,与之相应的是数据层也有多租户的支持. 数据层的多租户综述 多租户 ...
- [转载]数据层的多租户浅谈(SAAS多租户数据库设计)
原文:http://www.ibm.com/developerworks/cn/java/j-lo-dataMultitenant/index.html 在上一篇“浅析多租户在 Java 平台和某些 ...
- 浅谈mysql权限
一. 背景: “去IOE”的本质是“分布式+开源”架构替代“集中式+封闭”架构,变成彻底的云计算服务模式.去“IE”易,并且应该去,关键确实能省钱,而且运维难度不大,替代技术产品成熟.而去O ...
随机推荐
- python基础(5)---整型、字符串、列表、元组、字典内置方法和文件操作介绍
对于python而言,一切事物都是对象,对象是基于类创建的,对象继承了类的属性,方法等特性 1.int 首先,我们来查看下int包含了哪些函数 # python3.x dir(int) # ['__a ...
- Spring 中Bean的装配方式
最近又买了一本介绍SSM框架的书,是由黑马程序员编写的,书上讲的很好理解,边看边总结一下.主要总结一下bean的装配方式. Bean的装配可以理解为依赖系统注入,Bean的装配方式即Bean依赖注入的 ...
- WordPress插件:自定义登录注册插件:DX Login Register
众所周知,wordpress自带的注册系统比较简单,需要接收邮件密码才能完成.不过对于国内的站长来说,会碰到不少麻烦.首先个人站长一般都使用虚拟主机,有不少还是使用国外的,你的服务器不一定会提供邮件发 ...
- oracle 12C wmsys.wm_concat()函数
http://blog.itpub.net/31392094/viewspace-2149577/
- log4net 写日志配置
1. nuget install package log4net 2.站点跟目录新建配置文件 LogWriterConfig.xml <?xml version="1.0" ...
- new Date()时间
var myDate = new Date(); myDate.toLocaleDateString():可以获取当前日期myDate.toLocaleTimeString(); 可以获取当前时间 扩 ...
- Python编程举例-装饰器
装饰器的通常用途是扩展已定义好的函数的功能 一个浅显的装饰器编程例子 #装饰器函数 def outer(fun): def wrapper(): #添加新的功能 print('验证') fun() r ...
- Linux中建立软raid
Linux内核中有一个md(multiple devices)模块在底层管理RAID设备,它会在应用层给我们提供一个应用程序的工具mdadm. mdadm用于构建.管理和监视Linux MD设备(即R ...
- 使用JDBC连接数据库的一些BUG
题记:前几天用JDBC连接MYSQL数据库的时候,出现了一些BUG,有代码层次的,也有设置层次的, 下面的解决方法时我目前所遇到的,后期如果还有遇到的会进行补充. 一.出现:远程mysql_java. ...
- 【BZOJ 4169】 4169: Lmc的游戏 (树形DP)
4169: Lmc的游戏 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 44 Solved: 25 Description RHL有一天看到lmc在 ...