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

问题描述 投票:0回答:1

我正在使用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注释表达式中访问用户会话吗?如果是这样的话?谢谢。

spring spring-security annotations spring-annotations spring-el
1个回答
1
投票

电流的弹簧EL表达式是#session。所以你可以使用

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

但是这个会话是当前的HttpSession,它没有属性userId。根据spring el access你可以使用authenticationprincipal

尝试

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

假设用户名是userId ...

© www.soinside.com 2019 - 2024. All rights reserved.