V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
129duckflew
V2EX  ›  Java

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

  •  
  •   129duckflew · 166 天前 · 1815 次点击
    这是一个创建于 166 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    这么多途径方式,没必要纠结于拦截 sql 拼接来解决
    129duckflew
        10
    129duckflew  
    OP
       166 天前
    @zjsxwc 是这样,不过拼接 SQL 从性能角度来说是比较好的,这是我比较执着于拼接 SQL 的原因,例如我可以实现一个注解假设是 @DP 在 Dao 或者 Repo 层面的特定方法上面加 ,然后用 AOP 拦截 @DP 注解的方法的 Result ,过滤掉其中特定的结果,但这样的前提是我每次都需要查询出全量的未进行权限过滤之前的结果,另外 在分页的时候 这种情况下在会在内存当中 进行分页,涉及到分页,麻烦的事情也就更多了
    chuck1in
        11
    chuck1in  
       166 天前
    op 公司用的 jpa 吗,挺少见的。
    RandomJoke
        12
    RandomJoke  
       166 天前
    你要的可是 https://www.baeldung.com/hibernate-interceptor 这玩意?其实吧我感觉作用不大..原本好好的 ORM ,鬼知道一通操作把 SQL 改成啥样
    Ethan9527
        13
    Ethan9527  
       166 天前
    之前用 Querydsl 做过,跟你说的这个数据权限插件思路差不多,拦截到权限数据之后动态增加过滤条件
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   934 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 19:37 · PVG 03:37 · LAX 11:37 · JFK 14:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.