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

GET /resources/{resourceId}


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

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

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


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


如果指定的方法不是解决问题的最佳方法,那么我将对任何最佳方法的投入/反馈表示感谢。我想避免在控制器中执行此检查。我正在尝试通过类似于@PreAuthorize的工作原理通过Spring Security来实现。我认为访问resourceId是一项授权要求,如果用户无权访问该资源,我们甚至不应该进入API控制器。

最佳答案

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

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

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

boolean checkResourceAccess(Principal principal, int resourceId)

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

Java配置示例:

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


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

09-29 23:47