为啥在 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 实体参数?