Spring Security中authenticated与isAuthenticated()表达式均可生效的原因问询
问题结论
两种写法都生效是Spring Expression Language (SpEL) 的特性,和Java语言本身无关,底层也不存在名为authenticated的对应成员字段。
具体原理
- SpEL解析表达式时,默认遵循JavaBean命名规范做属性隐式映射:当表达式中写
authenticated这类属性名时,SpEL会自动尝试匹配对应类的isAuthenticated()(boolean类型Getter)、getAuthenticated()方法,不需要底层存在同名成员变量。 @PreAuthorize注解中用到的安全表达式根对象为SecurityExpressionRoot类,该类仅定义了public boolean isAuthenticated()方法,没有声明authenticated字段。你写的两种表达式最终都会调用同一个isAuthenticated()方法执行校验逻辑,效果完全一致。- 该特性是通用规则,Spring Security中其他同类型布尔校验都支持类似简写,比如
isAnonymous()可以简写为anonymous、isRememberMe()可以简写为rememberMe。
内容的提问来源于stack exchange,提问作者Zizheng Tai
相关产品推荐
相关产品推荐

