我可以将 SpringEL 的布尔值或运算符与 Spring 安全性的 @Preauthorize 一起使用吗?

Jaz*_*epi 3 java spring spring-security

当我尝试在 @Preauthorize 注释中使用“或”运算符时,出现以下错误。

java.lang.IllegalArgumentException: Failed to evaluate expression '#authenticatingUser.id == #id or hasRole('ROLE_ADMIN')'
Run Code Online (Sandbox Code Playgroud)

我认为我的语法是正确的,如以下文档中的“或”示例所示。

http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/expressions.html

并且 Spring Security 明确表示它使用“Spring EL 表达式”

http://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html

但是我还没有在网上看到任何关于在 @Preauthorize 注释中使用布尔“或”运算符的人的例子。

这是控制器代码的完整性。表面上我希望用户能够更改自己的密码或管理员。我已经成功地单独使用了 the#authenticatingUser.id == #id和 the hasRole('ROLE_ADMIN'),但是使用了 或 我得到了一个错误。

@RequestMapping(value = "{id}", method = RequestMethod.PUT)
@ResponseBody
@PreAuthorize("#authenticatingUser.id == #id or hasRole('ROLE_ADMIN')")
public User newPassword(@PathVariable int id, @RequestParam String newPassword, @ModelAttribute User authenticatingUser) {
    User user = userService.findById(id);
    user.setPassword(newPassword);
    return userService.save(user);
}
Run Code Online (Sandbox Code Playgroud)

Jaz*_*epi 5

您确实可以使用如上所示的 EL,or如所写。在#访问适用于原语你所期望的方式。我遇到的问题与 SpringEL 表达式的构造无关。

@PreAuthorize("#authenticatingUser.id == #id or hasRole('ROLE_ADMIN')")
public User newPassword(@PathVariable int id, @RequestParam String newPassword, @ModelAttribute User authenticatingUser) {
Run Code Online (Sandbox Code Playgroud)