当配置web安全性并指定.anyRequest().authenticated()
之类的内容时,Spring最终会在后台对请求调用SecurityExpressionRoot.isAuthenticated()
。SecurityExpressionRoot
的示例有一个字段,指向与请求相关联的当前Authentication
示例。SecurityExpressionRoot.isAuthenticated()
的实现如下所示:
@Override
public final boolean isAuthenticated() {
return !isAnonymous();
}
SecurityExpressionRoot
的isAnonymous()
方法也是公共的,而且在我看来,isAuthenticated()
和isAnonymous()
看起来并不是逻辑上的对立(也就是说,仅仅因为你没有通过身份验证,可能是由于会话过期,并不意味着我们不知道用户是谁)。
我猜在Spring Security分类法中,anonymous有更大的含义,但我不知道它们是什么,也没有在文档中找到任何东西。希望有人能告诉我为什么这个方法不简单地调用this.authentication.isAuthenticated()
是正确的。
1条答案
按热度按时间s8vozzvw1#
我有一些我现在还记得的理由:
1.身份验证可以为空,因此可能会发生
NullPointerException
。1.用户可以提供自己的
AuthenticationTrustResolver
,并自定义isAnonymous
的含义。1.您可以使用自定义类型
Authentication
(例如MultiFactorAuthentication
)来标识您尚未完成MFA身份验证,并且此身份验证可能是匿名的。您已经提供了凭据isAuthenticated = true
,但身份验证过程尚未完成。See this sample。这些方法是
public
,但它们是final
,你不能覆盖它们。相反,你必须自定义AuthenticationTrustResolver
。