我有一个Spring Web服务,用户只能访问特定资源。任何用户都可以请求获取资源信息,但是如果他们无权访问该资源,则需要抛出一个Authorization异常。 API如下:
GET /resources/{resourceId}
上面的API为用户提供了有关给定资源的所有信息。
目前,我使用
WebSecurityConfigurerAdapter
进行身份验证。为了添加授权,我发现可以将授予的授权设置为Authentication对象的一部分。这样,我可以使用类似@PreAuthorize("hasRole('ROLE_USER')")
的方法进行授权。但是,对于上述API,由于以下原因,我不确定上述授权方法是否适合。
我根据用户是否具有访问特定
resourceId
的特权进行授权。这不完全是角色。更像是特权。在此用例中使用hasRole()
是否仍然可以接受?如果确实使用了
hasRole()
注释,则需要执行类似@PreAuthorize("hasRole('ACCESS_RESOURCEID12346')")
的操作,其中RESOURCEID12346
是resourceId
。但是,只有进入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)")...
在这种方法中,您可以提供确定用户访问权限所需的任何逻辑。