SpringDataJpa 如何实现行级数据权限控制? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
129duckflew
V2EX    Java

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

  •  
  •   129duckflew 2024-06-11 10:33:27 +08:00 2594 次点击
    这是一个创建于 543 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    这么多途径方式,没必要纠结于拦截 sql 拼接来解决
    129duckflew
        10
    129duckflew  
    OP
       2024-06-11 15:34:23 +08:00
    @zjsxwc 是这样,不过拼接 SQL 从性能角度来说是比较好的,这是我比较执着于拼接 SQL 的原因,例如我可以实现一个注解假设是 @DP 在 Dao 或者 Repo 层面的特定方法上面加 ,然后用 AOP 拦截 @DP 注解的方法的 Result ,过滤掉其中特定的结果,但这样的前提是我每次都需要查询出全量的未进行权限过滤之前的结果,另外 在分页的时候 这种情况下在会在内存当中 进行分页,涉及到分页,麻烦的事情也就更多了
    chuck1in
        11
    chuck1in  
       2024-06-11 15:37:59 +08:00
    op 公司用的 jpa 吗,挺少见的。
    RandomJoke
        12
    RandomJoke  
       2024-06-11 17:05:38 +08:00
    你要的可是 https://www.baeldung.com/hibernate-interceptor 这玩意?其实吧我感觉作用不大..原本好好的 ORM ,鬼知道一通操作把 SQL 改成啥样
    Ethan9527
        13
    Ethan9527  
       2024-06-11 22:54:06 +08:00
    之前用 Querydsl 做过,跟你说的这个数据权限插件思路差不多,拦截到权限数据之后动态增加过滤条件
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2813 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 03:09 PVG 11:09 LAX 19:09 JFK 22:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86