Java 在不使用Spring ACL的情况下,基于;“创造者”;实体的

Java 在不使用Spring ACL的情况下,基于;“创造者”;实体的,java,spring,spring-mvc,spring-security,acl,Java,Spring,Spring Mvc,Spring Security,Acl,正如许多其他人所注意到的,ACL在这样的情况下执行这样一个概念上简单的事情似乎有些过分了 我正在寻找Spring Security中以下场景的简单实现: 我在控制器中有一个方法,用于处理事件实体的删除请求。我需要@PreAuthorize表达式来检查提交请求的用户的ID是否与请求所有者的ID匹配。可能通过Event.getOwner().getId()方法 这看起来怎么样?谢谢 我在想类似的事情。事件控制器中的以下方法: @PreAuthorize("#event.getOwner().get

正如许多其他人所注意到的,ACL在这样的情况下执行这样一个概念上简单的事情似乎有些过分了

我正在寻找Spring Security中以下场景的简单实现:

我在控制器中有一个方法,用于处理事件实体的删除请求。我需要@PreAuthorize表达式来检查提交请求的用户的ID是否与请求所有者的ID匹配。可能通过Event.getOwner().getId()方法

这看起来怎么样?谢谢

我在想类似的事情。事件控制器中的以下方法:

 @PreAuthorize("#event.getOwner().getId() == authentication.id")
 public void delete(@PathVariable("id") final Long id, @RequestBody final Event event) {
    repo.delete(id, event);
}

如果这是正确的用法,那么事件从何而来?换言之,“#”表示什么?我这样问是因为此时我们处于控制器中,那么,哪个事件是“事件”所指的呢?

您的想法不安全。它要求在删除请求中将事件信息(包括所有者)作为请求主体发送。通过这种方式,客户端可以欺骗所有者为当前用户而不是实际所有者

假设
id
是一个事件的唯一id,我建议使用以下方法作为最低解决方案:

@RequestMapping(value=“/{id}”,method=RequestMethod.DELETE)
@预授权(@repo.getOwnerOfEvent(#id)=authentication.name)
公共无效删除(@PathVariable(“id”)最终长id){
回购删除事件(id);
}
上述代码段需要一个名为“repo”的bean,该bean包含以下方法:

/**
*返回具有指定id的事件的所有者用户名。
*/
字符串getOwnerOfEvent(长id);

因此,从本质上讲,数据库层是场景中的最终网关守护者,因为客户端在发送请求时没有直接入口点欺骗eventOwnerID。相反,eventOwnerID仅由dto repo进行最终检查。对吗?还有,我想问你第二个问题,因为你刚刚给了我一个很好的解决方案。您对使用您建议的设置进行构建与使用完整的ACL系统(这似乎是标准的教科书选项,非常可扩展,但对于这样一个最多只能针对3或4种方法进行授权的简单检查,显然可能过于复杂)有何看法?@TylerDurden Yes,重要的是从数据库中读取所有者。关于ACL:s,你已经说明了它的优点和缺点……嘿@holmis83,你能看看我关于ACL实现的另一个任务吗?谢谢