前言

OData 其实没有权限的机制, Client 可以任意的 $select, $expand. 即便它可以做简单防御设置, 但是离平常的业务需求还是很远.

一般上 query entity 常见的需求是, 不能 $select 某些 property, 不能 expand 某些 propety, 需要过滤掉一些 row.

参考:

OData V4 modify $filter on server side

Web API OData Security per Entity

Missing documentation for FilterQueryValidator

解决思路

多 API

传统的方式就是开多几个 API, 然后在 API 上做权限访问.

这个方案不好, OData 的目的就是要减少接口丫.

Query Validator

OData 可以扩展写 $select, $expand 的 validator, 如果 client-side 要求超出范围就报错.

要过滤没有权限访问的数据, 就在 Controller 返回的 IQueryable 上做.

这个方案比较 OData way, 它本身就有 validation query 的概念, 过滤数据本来它就可以不需要负责.

Modify Query in Server-Side

发现 $select, $expand 超出权限就移除, 要过滤没有权限访问的数据就加 $filter.

这个方案比较不 OData way, 它本身没有 server-side 修改 query 的概念. 但是这个方案 client-side 会比较喜欢. 有时候 igrone 会比报错来的简单.

具体实现

Modify Query in Server-Side

OData V4 modify $filter on server side

这一篇给出了 2 个方案,

第 1 个是, override ApplyQuery

查源码会看到

EnableQueryAttribute 是一个 ActionFilterAttribute

实现了 OnActionExecuting 和 OnActionExecuted

在 OnActionExecuted 它会创建 ODataQueryOptions 然后调用 ApplyQuery

第 1 个方法就是 override 掉这个 ApplyQuery, 在里面偷龙转凤把 request 换掉, 创建新的 ODataQueryOptions 去 apply.

从源码上看, 可以看出 OData 并没有计划让我们去扩展支持这类功能, 属于 hack 的方式来的. 而这个 hack 也很糟糕.

比如如果 request 没有 query 其实是不会进入到 ApplyQuery 的. 所以并不能满足所有的需求. 另外 request 还有用于 $count 这个也在 ApplyQuery 之外, 所以回答里才需要额外的去处理 count 的问题.

第 2 个方法也是属于 hack 的 way 但比第一个好多了.

在 OnActionExecuting 直接把 URI 给换了, 那么到 OData 接手时就已经是修改后的 query 了. 省去了许多麻烦. 但无论如何这依然是 hack 的 way 不保证能长期使用.

OData – 权限管理的更多相关文章

  1. Asp.net core Identity + identity server + angular + odata + 权限管理

    今天踩了一个坑. 网站发布后看到了一个 error Refused to execute inline script because it violates the following Content ...

  2. Android权限管理之RxPermission解决Android 6.0 适配问题

    前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...

  3. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  4. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  5. SpringMVC+Shiro权限管理【转】

    1.权限的简单描述 2.实例表结构及内容及POJO 3.Shiro-pom.xml 4.Shiro-web.xml 5.Shiro-MyShiro-权限认证,登录认证层 6.Shiro-applica ...

  6. Android6.0运行时权限管理

    自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装 ...

  7. Oracle 表空间和用户权限管理

    一. 表空间 Oracle数据库包含逻辑结构和物理结构. 数据库的物理结构指的是构成数据库的一组操作系统文件. 数据库的逻辑结构是指描述数据组织方式的一组逻辑概念以及它们之间的关系. 表空间是数据库逻 ...

  8. [Django]用户权限学习系列之权限管理界面实现

    本系列前三章: http://www.cnblogs.com/CQ-LQJ/p/5604331.htmlPermission权限基本操作指令 http://www.cnblogs.com/CQ-LQJ ...

  9. [Django]用户权限学习系列之设计自有权限管理系统设计思路

    若在阅读本片文章遇到权限操作问题,请查看本系列的前两章! http://www.cnblogs.com/CQ-LQJ/p/5609690.html和http://www.cnblogs.com/CQ- ...

  10. 我的MYSQL学习心得(十三) 权限管理

    我的MYSQL学习心得(十三) 权限管理 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...

随机推荐

  1. leetcode简单(双指针):[88, 202, 345, 392, 455, 905, 922, 917, 925, 942]

    [toc 88. 合并两个有序数组 var merge = function(nums1, m, nums2, n) { let A1 = nums1.slice(0, m) let A2 = num ...

  2. 一文全懂:Linux磁盘分区

    一.物理设备的命名规则 在 Linux 系统中一切都是文件,硬件设备也不例外.所有的硬件设备文件都在/dev文件夹中. 硬件 在Linux内的文件名 SCSI/SATA/USB /dev/sd[a-p ...

  3. 安全可信,Solon v2.8.6 发布

    Solon 框架! Java "纯血国产"应用开发框架.开放原子开源基金会,孵化项目.从零开始构建(非 java-ee 架构),有灵活的接口规范与开放生态. 追求: 更快.更小.更 ...

  4. dcoker file

    dockerfile是来构建镜像文件 [root@docker docker-test-volume]# pwd /home/docker-test-volume vi ./dockerfile 通过 ...

  5. Anaconda Navigator打不开

    问题描述:之前安装的Anaconda Navigator,好久不用了,今天却打不开了,只有那个绿色圆环图标出现在桌面中央,点一下就没了.但jupyter notebook和Spyder可以正常使用. ...

  6. 【DataBase】MySQL 12 SQL函数 聚合函数

    视频参考自:P53 - P58 https://www.bilibili.com/video/BV1xW411u7ax 什么是分组函数? 用来统计使用,其具体的实现都是基于对字段的值聚合再处理 又称为 ...

  7. 【Java】自制查找工具

    需求:查找后台代码中写的SQL是否包含拆分表,如果存在,则返回那些表名 Context.txt 粘贴我们找到的DAO层代码,因为所有方法封装的SQL都在DAO层里[就理解为筛查的字符串] Dictio ...

  8. 【Layui】02 图标 Icon

    官网下载地址: https://www.layui.com/ 学习参考: https://www.bilibili.com/video/BV1ct411n7SN [Layui的文件结构] 我们只需要这 ...

  9. [rCore学习笔记 021]多道程序与分时任务

    写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 导读 ...

  10. 人形机器人的AI技术 —— 将一个大问题拆解为若干个小问题

    前文: 人形机器人 -- Figure 01机器人亮相 | OpenAI多模态能力加持 | 与人类流畅对话交互 | 具身智能的GPT-4时刻 所需的AI技术: 人形机器人的软件层面其实有: 视觉模块/ ...