如何在Spring注释表达式中读取会话变量,特别是@PreAuthorize

如何在Spring注释表达式中读取会话变量,特别是@PreAuthorize,spring,spring-security,annotations,spring-annotations,spring-el,Spring,Spring Security,Annotations,Spring Annotations,Spring El,我使用的是springsecurity@PreAuthorize注释,当我使用我在文档或其他在线示例中看到的“已知良好”表达式时,它就会起作用。示例代码不是一个真实的用例,它是人为设计的 以下表达式都是在一个或多个方法上使用的表达式的变体,这些方法的格式与下面的示例方法类似。这些表达式不是在同一时间使用的,甚至不是在同一方法中使用的。为了简单起见,它们只是一起显示在这里 @PreAuthorize("hasRole('ROLE_ADMIN')") @PreAuthorize("hasAuthor

我使用的是springsecurity@PreAuthorize注释,当我使用我在文档或其他在线示例中看到的“已知良好”表达式时,它就会起作用。示例代码不是一个真实的用例,它是人为设计的

以下表达式都是在一个或多个方法上使用的表达式的变体,这些方法的格式与下面的示例方法类似。这些表达式不是在同一时间使用的,甚至不是在同一方法中使用的。为了简单起见,它们只是一起显示在这里

@PreAuthorize("hasRole('ROLE_ADMIN')")
@PreAuthorize("hasAuthority('PERM_XYZ') or authentication.principal.id == #ownerId")
@PreAuthorize("hasRole('ROLE_USER') and #someValue == 'testValue'")
public List<Item> getSomeItems(Integer ownerId, String someValue ) {
    // code goes here
}
以上所有内容都与Spring安全性和@PreAuthorize注释有关,但这些并不是问题的核心

我知道许多访问会话的替代方法,并且已经解决了我的用例,但是我仍然想知道是否可以通过任何注释中的表达式访问会话


所以。。。可以在Spring注释表达式中访问用户会话吗?如果可以,如何访问?谢谢。

当前的spring EL表达式是
#session
。 所以你可以用

@PreAuthorize("#userId == session.userId")
但此会话是当前的HttpSession,它没有属性
userId
。根据需要,您可以使用
身份验证
主体

试一试


假设用户名是userId…

如果您使用的是Spring Security,为什么要检查会话变量而不是当前登录的用户。我有一种强烈的感觉,一种“为什么要这样做”的情绪几乎会立即弹出。原始示例代码中的“userId”不是真正的用例,因此它被一个更通用的示例所取代,该示例显示了有效的表达式。我主要想知道是否有一种通过注释表达式访问会话对象或请求对象的简单方法。这最终是一个好奇的问题,因为我不能做一些我认为很简单的事情。然后,您可能希望使用一个不依赖或不解析身份验证的示例。请求应该是可用的,因此我希望
request.session.getAttribute('someValue')
能够实际工作。它们是生成相同的异常还是不同的异常?在上面的第一个示例中,引号的位置是否正确?语法是否正确?我在STS/Eclipse中遇到了一个“会话无法解析为变量”错误,并且没有可用的快速修复方法。在我的原始问题中,我在错误的地方引用了一些问题,但已经解决了它们。我也尝试了session,但没有成功,尽管语法与您的不一样。该问题已被编辑为更一般,因为我要测试的会话值与身份验证或principal对象无关,因此我无法使用principal.username。
@PreAuthorize("#someValue == #session.someValue")
@PreAuthorize("#someValue == session.someValue")
@PreAuthorize("#someValue == session.getAttribute('someValue')")
@PreAuthorize("#someValue == request.session.someValue")
@PreAuthorize("#someValue == request.session.getAttribute('someValue')")
@PreAuthorize("#userId == session.userId")
@PreAuthorize("#userId == principal.username")