gpt4 book ai didi

spring - 使用 Spring 检查实体/对象是否属于当前登录的用户

转载 作者:行者123 更新时间:2023-12-03 16:17:08 26 4
gpt4 key购买 nike

我正在开发一个 Spring Web 应用程序,它使用:

  • Spring MVC
  • Spring 芯
  • 春屋
  • Spring 安全
  • Spring Data JPA
  • mysql

  • 我遇到的问题如下: 每次访问 从 web 层到应用程序的 实体/对象 我希望能够 检查他们是否确实属于当前用户 .

    让我举例说明:应用程序的用户有广告、类(class)(称为实体/对象)。我经常使用 PK/ID 对这些对象/实体执行 GET 或 POST,以便检索、更新或删除这些对象。到目前为止,我还没有找到一种简洁灵活的方法来防止用户检索、更新或删除其他人的对象。

    我使用 Spring Security 和 我随时知道谁是当前用户 (当前登录的用户/负责人)但我是 不确定在哪里(哪一层)以及如何执行检查 .

    我曾尝试使用 AspectJ 为服务和 Controller 方法提供建议,但我实现它的方式远非理想,因为仅更改方法签名会导致建议不被应用。

    我可以将 ACL 与 Spring Security 一起使用,但它增加了不必要的复杂性:我只需要授予或拒绝对实体是否属于帐户/用户的访问权限。

    已经遇到此问题的任何人都可以提供一个干净、灵活和干燥的解决方案吗?

    最佳答案

    在我看来,这是一个授权问题。本质上,您要确认当前用户具有对实体/对象执行操作的正确权限。因此,我建议您的解决方案应用于服务层(中间层)。

    Spring Security 架构的很大一部分是处理授权决策。值得花时间阅读 section of the documentation以确保您了解一般架构。

    概括地说,Spring Security 将调用前访问决策委托(delegate)给 AccessDecisionManager。 . AccessDecisionManager通常会查阅已注册的 AccessionDecisionVoter 列表s 谁,顾名思义,“投票”是否允许根据当前的执行状态继续调用,例如谁登录,用户请求什么数据。
    AccessDecisionVoter决定是否授予访问权限完全取决于实现。所以理论上你可以做任何事情来决定是否授权一个特定的请求。

    值得庆幸的是(正如您所期望的那样)Spring 提供了一些相当合理的默认实现,可以让您开箱即用地实现很多您想要的东西。特别是我相信Method Security Expressions应该让你实现你想要的(这将取决于你的服务是如何实现的)。

    根据文档,您可以使用 Spring Security 的 @PreAuthorise注释与一些查看当前方法调用或执行上下文的参数的表达式相结合。例如:

    @PreAuthorise("#u == principal.id")
    public List<Foo> loadFoos(@P("u")String userId);

    在这个例子中,方法调用只有在 userId 的值为参数与当前经过身份验证的用户的 id 完全匹配。

    您的确切方法/表达式将取决于您的服务是如何实现的,但希望这能给您一个良好的起点。

    关于spring - 使用 Spring 检查实体/对象是否属于当前登录的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22454451/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com