前言

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. 创建数据库时排序规则utf8_general_ci与utf8_bin的区别

    在MySQL数据库中,字符集(如utf8)定义了字符如何存储,而排序规则(Collation)则定义了字符如何比较.排序和区分大小写.utf8_general_ci和utf8_bin是两种常用的UTF ...

  2. vue中 lang="ts"与js的区别

    `lang="ts"` 与 `js` 的区别在于指定了脚本语言的类型,其中: - `lang="ts"` 指定了 TypeScript,一种由微软开发的 Jav ...

  3. 开启GitLab的邮件通知功能以及一些外观配置

    前言 维护GitLab的同事离职了 刚好又有新实习生需要申请账号 只能我来出手了 其实之前安装了 GitLab 之后一直还是用得比较粗糙的 属于是勉强能用的水平,有些配置都还没改好 这次把邮件功能.域 ...

  4. oeasy教您玩转vim - 16 - # 行内贴靠

    行头行尾 回忆上节课内容 跳跃 向前跳跃是 f 向后跳跃是 F 继续 保持方向是 ; 改变方向是 , 可以加上 [count] 来加速 还有什么好玩的吗? 动手 #这次还是用无配置的方式启动 vi - ...

  5. 题解:CF1984B Large Addition

    题解:CF1984B Large Addition 题意 判断 \(n\) 是否是两个位数相同的 \(large\) 数的和. 思路 有以下三种证明方法: 最高位为 \(1\),因为两个 \(larg ...

  6. php环境-2024年3月19日

    laravel 6[laravel的orm比其他框架的好用,可以写很少的代码就能完成] php 7.4 mysql 5.7 centos7 redis jwt 队列(laravel的redis队列,或 ...

  7. Apache COC闪电演讲总结【OSGraph】

    大家能看到我最近一直在折腾与OSGraph这个产品相关的事情,之前在文章<妙用OSGraph:发掘GitHub知识图谱上的开源故事>中向大家阐述过这个产品的设计理念和应用价值.比方说以下问 ...

  8. 【DataBase】SQL优化问题

    在DAO层的动态SQL: //订单新增,查询配件主数据 @SuppressWarnings("rawtypes") public PageInfoDto getPartsForPa ...

  9. 始智AI —— https://wisemodel.cn/ —— 试用

    清华大学的合资企业推出的服务: 始智AI -- https://wisemodel.cn/ 链接: 始智AI -- https://wisemodel.cn/ 和modelscope比相对简约,毕竟功 ...

  10. batch_norm在强化学习中建议使用的形式

    def batch_norm(layer, **kwargs): """ Apply batch normalization to an existing layer. ...