我使用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注释表达式中访问用户会话吗?如果是这样的话?感谢。
答案 0 :(得分:1)
当前的弹簧EL表达式为#session
。
所以你可以使用
@PreAuthorize("#userId == session.userId")
但是这个会话是当前的HttpSession,它没有属性userId
。根据{{3}},您可以使用authentication
或principal
尝试
@PreAuthorize("#userId == principal.username")
假设用户名是userId ...