考虑对控制器的GET请求,该控制器随后又从数据库加载资源。假设数据库资源有一个标志。该标志设置资源是否公开。如果资源标志为true,则仅返回资源。如果资源是public标志,则将其设置为false,然后检查传入的用户是否是该资源的正确所有者。如果用户不在这种情况下,请发送401。

如何配置Spring Security以解决此用例?

最佳答案

如前所述,您可以使用@PostAuthorize

例如,假设您有一个服务方法返回具有DatabaseResourcepublicFlag字段的owner,则如果AccessDeniedExceptionpublicFlag == false,则以下内容将抛出owner != authentication.name

@PostAuthorize("returnObject.publicFlag == true
                 || returnObject.owner == authentication.name")
public DatabaseResource returnResource() {
    // load the resource...
    return databaseResource;
}

08-18 11:28