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

时间:2016-05-01 08:08:11

标签: spring spring-security annotations spring-annotations spring-el

我使用Spring Security @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
}

我希望能够做的是在表达式中针对会话变量测试方法参数,如下所示:

@PreAuthorize("hasAuthority('PERM_XYZ') or #someValue == session.someOtherValue")
public List<Item> getSomeItems(Integer someValue) {
    // code goes here
}

我原本以为在表达式中访问会话将是一项基本任务,但我还没有在网上找到一个例子,甚至没有人问过如何做。

我已经尝试了以下所有内容以及更多内容,但它们都会产生异常:

@PreAuthorize("#someValue == #session.someValue")
@PreAuthorize("#someValue == session.someValue")
@PreAuthorize("#someValue == session.getAttribute('someValue')")
@PreAuthorize("#someValue == request.session.someValue")
@PreAuthorize("#someValue == request.session.getAttribute('someValue')")

以上所有内容都与Spring Security和@PreAuthorize注释有关,但这些事情并不是解决问题的核心。

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

那么......可以在Spring注释表达式中访问用户会话吗?如果是这样的话?感谢。

1 个答案:

答案 0 :(得分:1)

当前的弹簧EL表达式为#session。 所以你可以使用

@PreAuthorize("#userId == session.userId")

但是这个会话是当前的HttpSession,它没有属性userId。根据{{​​3}},您可以使用authenticationprincipal

尝试

@PreAuthorize("#userId == principal.username")

假设用户名是userId ...