前言

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. [rCore学习笔记 012]彩色化LOG

    实验要求 实现分支:ch1 完成实验指导书中的内容并在裸机上实现 hello world 输出. 实现彩色输出宏(只要求可以彩色输出,不要求 log 等级控制,不要求多种颜色) 隐形要求 可以关闭内核 ...

  2. Linux安装 JDK (CentOS 7)

    Linux安装 JDK 一.Linux安装软件的方式 第一种:二进制发布包安装: 软件已经针对具体平台编译打包发布,只要解压,修改配置即可 第二种: rpm安装 : 软件已经按照redhat的包管理规 ...

  3. 靶机: hard_socnet2

    靶机: hard_socnet2 准备 靶机:https://download.vulnhub.com/boredhackerblog/hard_socnet2.ova MD5 验证: 9d6bed1 ...

  4. 使用JavaScript编写vue指令v-model,v-model原理实现

    首先先要知道的是v-model的作用是实现数据的双向绑定,即: 数据在视图层的双向响应. 实现思路主要分为两步: 第一步:数据层到视图层的响应 将数据响应到视图层的方式,在vue2使用的是Object ...

  5. vue项目 回到顶部功能 定位在头部

    'backBox'是外层容器类名, 根据传入的index,定位在不同的位置 组件: <template> <div class="toTop" @click=&q ...

  6. 商业级java开发单体项目环境搭建

    写在开发前,端口经常被战占,windows10用以下命令先查先杀,netstat -aon | findstr "8080" taskkill /F /PID <PID> ...

  7. scratch编程作品-《滚动的物理小球》

    程序说明: <滚动的物理小球>是一款基于Scratch平台开发的小游戏.在这个游戏中,玩家通过按左右方向键来控制一个小球在屏幕上的左右移动.小球在移动过程中,完全遵循物理引擎的规则,如加速 ...

  8. python报错:pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to "None"

    运行python代码报错: 问题发现: 问题其实十分的狗血,这个代码是在服务器上运行的,运行之前其实并没有看具体的代码情况,git clone 下载下来就直接运行了,原来这个代码需要进行图片绘制,说直 ...

  9. 深度学习用什么卡比较给力?—— A100/H100真的么有RTX4090好吗?

    近日看到这么一个帖子: https://www.zhihu.com/question/612568623/answer/3131709693 ============================= ...

  10. 老版本mujoco: mujoco 1.31 1.40 1.50 2.00 版本下载地址

    下载地址: https://www.roboti.us/download.html 激活码下载地址: https://www.roboti.us/file/mjkey.txt 安装教程: https: ...