【问题标题】:Spring Security AuthorizationSpring 安全授权
【发布时间】:2017-05-10 11:10:56
【问题描述】:

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

GET /resources/{resourceId}

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

目前我使用WebSecurityConfigurerAdapter 进行身份验证。要添加授权,我观察到我可以将授予的权限设置为 Authentication 对象的一部分。这样做时,我可以使用@PreAuthorize("hasRole('ROLE_USER')") 之类的东西来进行授权。

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

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

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

【问题讨论】:

  • 你有用户信息,所以我会在数据库中提供一个 UserResouce 表并检查 get 上的关系。
  • 1.这不是将身份验证和授权结合起来吗?根据我的设计理解,最好将身份验证和授权分开。 2. 如何访问我需要检查的 resourceId?它只是 API 路径的一部分。
  • 我不知道它会如何结合它。您在 ROLE_USER 上通过 preauth 进行了身份验证,对吗?因此,您已经通过身份验证,并且拥有路径和 ID。因此,做出假设,您可以在查询使用上述表的情况下执行getResourceByUserAndResourceId(...)
  • 你是在建议这样的事情:@PreAuthorize("hasRole('ACCESS_" + @PathVariable("resourceId") + "')")?那不编译。
  • @AndroidDev93 RESOURCEID12346 看起来很像 ACL,应该是动态的,而不是直接在 Java 代码中。

标签: java spring spring-security


【解决方案1】:

通过绑定到资源 ID 的角色分配权限似乎是潜在的维护噩梦。如果您不想允许访问控制器,那么access 可能是最好的选择。

以上链接包含基于 Java 和 xml 的配置示例,并展示了如何在进入控制器之前访问路径。

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

boolean checkResourceAccess(Principal principal, int resourceId)

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

Java 配置示例:

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

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

【讨论】:

  • 这种方法是否比在身份验证期间对该 resourceId 使用 GrantedAuthority 然后使用 @PreAuthorize("hasAuthority('ACCESS_#resourceId')") 更好?
  • 我认为“更好”是主观的,但我会这么认为。你读过接受的答案here吗?
猜你喜欢
  • 2012-04-07
  • 2013-11-02
  • 1970-01-01
  • 2017-03-14
  • 2015-09-01
  • 2023-04-01
  • 2015-02-20
  • 2014-07-08
相关资源
最近更新 更多