spring-security 在Spring Security中,为什么SecurityExpressionRoot#isAuthenticated只检查!isAnonymous?

ffx8fchx  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(176)

当配置web安全性并指定.anyRequest().authenticated()之类的内容时,Spring最终会在后台对请求调用SecurityExpressionRoot.isAuthenticated()SecurityExpressionRoot的示例有一个字段,指向与请求相关联的当前Authentication示例。
SecurityExpressionRoot.isAuthenticated()的实现如下所示:

@Override
public final boolean isAuthenticated() {
  return !isAnonymous();
}

SecurityExpressionRootisAnonymous()方法也是公共的,而且在我看来,isAuthenticated()isAnonymous()看起来并不是逻辑上的对立(也就是说,仅仅因为你没有通过身份验证,可能是由于会话过期,并不意味着我们不知道用户是谁)。
我猜在Spring Security分类法中,anonymous有更大的含义,但我不知道它们是什么,也没有在文档中找到任何东西。希望有人能告诉我为什么这个方法不简单地调用this.authentication.isAuthenticated()是正确的。

s8vozzvw

s8vozzvw1#

我有一些我现在还记得的理由:
1.身份验证可以为空,因此可能会发生NullPointerException
1.用户可以提供自己的AuthenticationTrustResolver,并自定义isAnonymous的含义。
1.您可以使用自定义类型Authentication(例如MultiFactorAuthentication)来标识您尚未完成MFA身份验证,并且此身份验证可能是匿名的。您已经提供了凭据isAuthenticated = true,但身份验证过程尚未完成。See this sample
这些方法是public,但它们是final,你不能覆盖它们。相反,你必须自定义AuthenticationTrustResolver

相关问题