考虑对控制器的GET请求,该控制器随后又从数据库加载资源。假设数据库资源有一个标志。该标志设置资源是否公开。如果资源标志为true,则仅返回资源。如果资源是public标志,则将其设置为false,然后检查传入的用户是否是该资源的正确所有者。如果用户不在这种情况下,请发送401。
如何配置Spring Security以解决此用例?
最佳答案
如前所述,您可以使用@PostAuthorize
。
例如,假设您有一个服务方法返回具有DatabaseResource
和publicFlag
字段的owner
,则如果AccessDeniedException
和publicFlag == false
,则以下内容将抛出owner != authentication.name
。
@PostAuthorize("returnObject.publicFlag == true
|| returnObject.owner == authentication.name")
public DatabaseResource returnResource() {
// load the resource...
return databaseResource;
}