java - 不使用Spring ACL,实现基于实体 "creator"的方法级安全检查

标签 java spring spring-mvc spring-security acl

正如许多其他人所指出的那样,在这种情况下,ACL 对于执行概念上如此简单的事情似乎有点过分了。

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

我在 Controller 中有一个方法可以处理事件实体的删除请求。我需要 @PreAuthorize 表达式来检查以确保提交请求的用户的 ID 与请求所有者的 ID 匹配。也许通过 Event.getOwner().getId() 方法。

这看起来怎么样?谢谢。

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

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

如果这是正确的用法,#event 从何而来?换句话说,'#' 表示什么?我问是因为此时我们在 Controller 中,所以 #event 指的是哪个事件?

最佳答案

你的想法不安全。要求在删除请求中将包括owner在内的事件信息作为请求体发送。有了这个,客户端可以欺骗所有者是当前用户而不是实际所有者。

假设 id 是一个事件的唯一 ID,我会建议像下面这样的最小解决方案:

@RequestMapping(value="/{id}", method=RequestMethod.DELETE)
@PreAuthorize("@repo.getOwnerOfEvent(#id) == authentication.name")
public void delete(@PathVariable("id") final Long id) {
    repo.deleteEvent(id);
}

上面的代码片段需要一个名为“repo”的 bean,它包含以下方法:

/**
 * Returns the owner username of the event with the specified id.
 */
String getOwnerOfEvent(long id);

关于java - 不使用Spring ACL,实现基于实体 "creator"的方法级安全检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43595831/

相关文章:

java - 数组 <?在 Java 中扩展 T>

java - 如何为手机中安装的 Whatsapp、Facebook 或其他应用程序创建共享按钮

java - Selenium Webdriver - 如何从非典型下拉列表中选择选项

java - 在 JAVA Spring 框架中使用存储库时如何正确使用 MongoDB 进行身份验证

java - 如何通过 Spring 使用脚本初始化内存中的 HSQLDB

java - 我 thymeleaf 如何使用页面参数作为属性键?

java - 递归二分查找和排序

java - Spring - @RequestBody 阻止请求?

java - Spring mvc中如何给mysql添加添加设置值

spring-mvc - 即使定义了 CORS 映射,Google Tag Manager 403 的每个请求也是如此