gpt4 book ai didi

java - Spring安全授权

转载 作者:行者123 更新时间:2023-11-30 02:42:10 24 4
gpt4 key购买 nike

我有一个 Spring Web 服务,用户只能访问特定资源。任何用户都可以发出请求来获取资源信息,但如果他们无权访问该资源,我需要抛出授权异常。接口(interface)如下:

GET /resources/{resourceId}

上述 API 向用户提供有关给定资源的所有信息。

目前我使用 WebSecurityConfigurerAdapter 进行身份验证。为了添加授权,我发现我可以将授予的权限设置为身份验证对象的一部分。这样做时,我可以使用类似 @PreAuthorize("hasRole('ROLE_USER')") 的方法来进行授权。

但是,对于上述API,我不确定上述授权方式是否合适,原因如下。

  1. 我根据用户是否有权访问特定resourceId进行授权。这不完全是一个角色。更像是一种特权。对于此用例,使用 hasRole() 是否仍然可以接受?
  2. 如果我确实使用了 hasRole() 注释,我需要执行类似 @PreAuthorize("hasRole('ACCESS_RESOURCEID12346')") 的操作,其中 RESOURCEID12346 resourceId。但是,只有进入 API Controller 后,我们才能访问 resourceId。那么,如何将该值用于授权注释呢?

如果指定的方法不是解决问题的最佳方法,我将不胜感激任何关于最佳方法的输入/反馈。我想避免在 Controller 中进行此检查。我正在尝试通过 Spring Security 来完成此操作,类似于 @PreAuthorize 的工作方式。我认为访问resourceId是一项授权要求,如果用户无权访问该资源,我们甚至不应该进入API Controller 。

最佳答案

通过绑定(bind)到资源 ID 的角色分配权限似乎是潜在的维护噩梦。如果您不想允许访问 Controller ,那么也许 access是最好用的东西。

上面的链接包含基于 Java 和 xml 的配置示例,并显示了如何在进入 Controller 之前获取对路径的访问权限。

您将提供一个您引用的方法,例如:

boolean checkResourceAccess(主体主体,int资源Id)

在您的配置中,您引用 url 参数,例如 #resourceId 将其映射到 {resourceId}

Java 配置示例:

http.authorizeRequests()
.antMatchers("/resources/{resourceId}")
.access("@yourBean.checkResourceAccess(principal,#resourceId)")...

在该方法中,您提供确定用户访问权限所需的任何逻辑。

关于java - Spring安全授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41323578/

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