SpringDataJpa 如何实现行级数据权限控制?

198 天前
 129duckflew

在网上搜索了很多资料也没发现特别有用的,MybatisPlus 有一个数据权限插件 一键启用 再配置一个 SQL 拼接器就可以了,感觉还是比较方便,jpa 这边没发现有对应的东西,听说老外用 jpa 用的比较多 为什么没有看到相关的讨论了,搜索了一下都是很多年前的回答了,有说用数据库的 ACL 原生实现的,这是主流做法吗?

1870 次点击
所在节点    Java
13 条回复
nothingistrue
198 天前
那是业务逻辑层/领域模型/数据模型/真模型层的活,不是仅作为基础设施的 SpringDataJpa 该管的事。
129duckflew
198 天前
@nothingistrue Mybatis Plus 有一个数据权限插件 https://baomidou.com/plugins/data-permission/ ,如果希望用 Jpa 这个技术来实现类似的效果 可以从哪些角度考虑呢?
nothingistrue
198 天前
用 SQL ,或者数据查询去控制权限,老外,最起码也是近些年还能够宣传到中国的老外,是不会这么干的。
129duckflew
198 天前
@nothingistrue 那老外不会有类似的多租户或者数据权限的需求吗,他们一般用什么解决方案呢?
lybcyd
198 天前
数据权限属于鉴权,和数据访问层的实现应该是无关的。最好是单独实现一个 interceptor 或者切面,然后通过自定义注解之类的方式来实现。
KongLiu
197 天前
这种是权限问题了把,一般都是用拦截器做,怎么也轮不到一个 ORM 去做
wxw752
197 天前
Mybatis Plus 的插件也是 Interceptor ,你可能是想问问 jpa 那边有没有人做 JPA Plus ?
yidinghe
197 天前
没有通用的需求就没有通用的解决方案。比如说查订单,订单都在一张表里,而每个用户只能查自己的订单,这算不算行级权限控制?当然算。凡是有订单的系统,自然而然就把这个作为业务需求给实现了。
zjsxwc
197 天前
这权限问题,不单单,你 sql 层能解决。

业务逻辑层能解决(面向切面编程、中间件拦截处理)、
数据传输序列化层能解决( serializer 、dto )、
甚至页面展示渲染层也能解决

这么多途径方式,没必要纠结于拦截 sql 拼接来解决
129duckflew
197 天前
@zjsxwc 是这样,不过拼接 SQL 从性能角度来说是比较好的,这是我比较执着于拼接 SQL 的原因,例如我可以实现一个注解假设是 @DP 在 Dao 或者 Repo 层面的特定方法上面加 ,然后用 AOP 拦截 @DP 注解的方法的 Result ,过滤掉其中特定的结果,但这样的前提是我每次都需要查询出全量的未进行权限过滤之前的结果,另外 在分页的时候 这种情况下在会在内存当中 进行分页,涉及到分页,麻烦的事情也就更多了
chuck1in
197 天前
op 公司用的 jpa 吗,挺少见的。
RandomJoke
197 天前
你要的可是 https://www.baeldung.com/hibernate-interceptor 这玩意?其实吧我感觉作用不大..原本好好的 ORM ,鬼知道一通操作把 SQL 改成啥样
Ethan9527
197 天前
之前用 Querydsl 做过,跟你说的这个数据权限插件思路差不多,拦截到权限数据之后动态增加过滤条件

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1048436

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX