当前位置: 首页 > 知识库问答 >
问题:

Spring Security身份验证提供程序autenticate()返回null的原因

公良云
2023-03-14

最近,我在研究Spring security的身份验证提供商。

在身份验证()方法中,文档说,“如果身份验证提供者无法支持对传递的身份验证对象的身份验证,可能会返回null。在这种情况下,将尝试下一个支持呈现的身份验证类的身份验证提供者。”

我们还有另一个方法supports(),它指示此提供程序是否支持身份验证类型。

据我所知,“AuthenticationManager”首先调用support()来检查提供者是否支持这种类型。然后调用身份验证()方法。所以,根据我的理解,只有在提供者支持它时才调用身份验证。

所以,我的问题是“如果提供程序支持这种类型的身份验证,那么为什么它应该从身份验证()返回null?”为什么文档会说“如果AuthenticationProvider无法支持对传递的身份验证对象的身份验证,那么它可能会返回null”??它是否应该始终支持它?(因为我们通过supports()检查了它的兼容性。)

你能举个例子说明提供者需要返回null吗?

提前感谢。

共有1个答案

秦珂
2023-03-14

引用Laurentiu Spilca的《Spring安全行动》

AuthentiationProvider接口中的第二种方法是支持-(Class

我认为这一类比可以澄清问题。

身份验证管理器和身份验证提供程序如何协同工作来验证或使身份验证请求无效的一个类比是,您的门有一个更复杂的锁。你可以用卡片或老式的物理钥匙打开这把锁。锁本身是决定是否开门的身份验证管理器。为了做出这个决定,它将授权给两个身份验证提供者:一个知道如何验证卡,另一个知道如何验证物理密钥。如果你出示一张卡片开门,只使用物理密钥的身份验证提供商会抱怨说,它不知道这种身份验证。但另一个提供商支持这种身份验证,并验证该卡是否对该门有效。这实际上就是supports()方法的目的。除了测试身份验证类型,Spring Security还增加了一层灵活性。门锁可以识别多种卡片。在这种情况下,当您出示一张卡时,其中一个身份验证提供商可能会说:“我理解这是一张卡。但这不是我可以验证的卡的类型!”当supports()返回true,但authenticate()返回null时,就会发生这种情况。

 类似资料:
  • 问题内容: 使用Passport.js是否可以为同一路由指定多个身份验证提供程序? 例如(在护照指南中),我可以在以下示例路线中使用本地策略以及Facebook和Twitter策略吗? 问题答案: Passport的中间件的构建方式使您可以在一个呼叫中使用多种策略。 但是,它是用OR顺序定义的。也就是说,只有在所有策略均未成功返回的情况下,它才会失败。 这是您将如何使用它: 换句话说,使用它的方法

  • 我实现了自己的UserDetailsService。我正在Java中配置Spring Security性。我如何创建默认身份验证提供程序与我的自定义用户服务详细信息服务和一些密码编码器? 但是,当我运行这段代码时,我有异常: 我想我做错了什么

  • 我希望我的web应用程序的用户通过LDAP和额外的自定义身份验证进行身份验证。这是一个用Kotlin编写的Spring Boot应用程序。我将AuthenticationManagerBuilder配置为 我希望链接身份验证,以便如果CustomAuthenticationProvider成功地进行身份验证(函数authenticate不抛出),身份验证将继续使用LDAP身份验证提供程序。 正如所

  • 我的问题是,我希望有两个身份验证提供商 之前:我有我的UserDetailServiceImpl,我根据数据库中的数据验证了用户的身份(不确定是哪个提供者) 现在:我使用了ActiveDirectoryLdapAuthentiation提供程序,如下所示 我成功了,所以我可以认证。 问题是: 我现在无法再使用数据库用户登录,现在只有LDAP。 未使用UserDetailsService,因此用户具

  • 我有一个使用bouncycastle库的Java applet。当我在Eclipse上运行应用程序时,一切正常,但当我在带有标记的浏览器上使用applet时,当我添加安全BouncyCastleProvider时,它会引发异常。 我的stackTrace是: 我正在使用bcpkix-jdk15on-1.48.jar和bcprov-jdk15on-1.48.jar版本的BouncyCastle。为什

  • 现在,我们有了集成执行器。我希望我的执行器endpoint可以通过基本认证在浏览器中访问。 为此,我用@order(1)添加了WebSecurityConfigurerAdapter的一个实现。它在浏览器上工作得很好。但是,当我从angualar应用程序调用登录url时,它为/oauth/token url给出了401个未经授权的错误,因此我无法从ui应用程序登录。 任何帮助将感谢解决此错误。 类