Spring安全授权

时间:2016-12-25 18:33:02

标签: java spring spring-security

我有一个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。那么,如何将该值用于授权注释?
  3. 如果指定的方法不是解决问题的最佳方法,我将不胜感激任何有关最佳方法的输入/反馈。我想避免在控制器中进行此检查。我试图通过类似于@PreAuthorize工作的Spring Security来做到这一点。我认为访问resourceId是一项授权要求,如果用户无法访问该资源,我们甚至不应该进入API控制器。

1 个答案:

答案 0 :(得分:2)

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

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

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

boolean checkResourceAccess(Principal principal, int resourceId)

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

Java配置示例:

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

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