我正在使用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注释表达式中访问用户会话吗?如果是这样的话?谢谢。
电流的弹簧EL表达式是#session
。所以你可以使用
@PreAuthorize("#userId == session.userId")
但是这个会话是当前的HttpSession,它没有属性userId
。根据spring el access你可以使用authentication
或principal
尝试
@PreAuthorize("#userId == principal.username")
假设用户名是userId ...