为啥在 Spring Security 的 hasPermission 检查中使用“#post”而不是“post”

Posted

技术标签:

【中文标题】为啥在 Spring Security 的 hasPermission 检查中使用“#post”而不是“post”【英文标题】:Why use "#post" instead of "post" in hasPermission check in Spring Security为什么在 Spring Security 的 hasPermission 检查中使用“#post”而不是“post” 【发布时间】:2015-09-09 12:08:15 【问题描述】:

我是 Spring Security 的新手。在分析以下代码更改时,我无法理解为什么使用“#post”而不是“post”?为什么“post”这个词要以“#”为前缀? post 是一个对象。

@PreAuthorize("hasPermission(#post, 'MANAGER') or hasRole('ROLE_MODERATOR')")
+   @PreAuthorize("hasPermission(#post, 'write') or hasRole('ROLE_MODERATOR')")
    public void updateFullyPost(Post post) throws AppException;

我参考了 spring 安全文档并找到了以下内容。

hasPermission(对象目标,对象权限) 如果用户有权访问所提供的目标以获得给定的权限,则返回 true。例如,hasPermission(domainObject, 'read')

第一个参数应该是一个目标对象。

有人可以提供一些指导吗?欣赏它。谢谢。

【问题讨论】:

【参考方案1】:

在Spring Expression Language(SpEL)中:

可以使用#variableName语法在表达式中引用变量。

当调用带有 @PreAuthorize 等注解的方法时,方法参数将作为变量传递给 SpEL。

如果省略#,Spring 将在根对象 中查找属性,在​​本例中为SecurityExpressionRoot。您可以在其中找到hasPermission 方法。

【讨论】:

以上是关于为啥在 Spring Security 的 hasPermission 检查中使用“#post”而不是“post”的主要内容,如果未能解决你的问题,请参考以下文章

尽管我们不提供 Spring Security 配置,为啥 Spring Security 应用程序会重定向到登录页面?

为啥 Spring boot Security Basic Authentication 慢?

为啥 Spring Security getAuthentication() 在服务器上返回 null

spring security:为啥我们不能在@PreAuthorize 中访问 Hibernate 实体参数?

为啥在 Spring Security 的 hasPermission 检查中使用“#post”而不是“post”

为啥spring security hasRole函数不认证任何api