首页 > 解决方案 > 在AuthenticationProvider中成功认证后是否需要将原始凭据放入UsernamePasswordAuthenticationToken?

问题描述

我在入口处收到一个已经确认的用户 ID。我决定Authentication为传入的 id -编写我的实现VkIdAuthentication。然后执行AuthenticationProvider那个接收VkIdAuthentication然后找到UserDetails并返回UsernamePasswordAuthenticationToken

但我没有用户提供的原始凭据。可以将 null 作为凭据UsernamePasswordAuthenticationToken吗?

一条评论AbstractUserDetailsAuthenticationProvider让我感到困惑:

// 确保我们返回用户提供的原始凭据, // 因此即使使用编码密码,后续尝试也会成功。

标签: springspring-security

解决方案


从以下评论中发现

更广泛地说:即使在会话经过身份验证之后,也许有身份验证提供程序确实需要凭据,或者可能存在其他用例,其中出于某些其他目的需要使用凭据,但是(从我天真的角度来看)似乎用户凭据身份验证成功完成后永远不需要,所以也许所有身份验证管理器都应该从身份验证实例中清除凭据,而不管涉及的令牌/提供者的类型如何?

从我在当前源代码中看到的内容来看,默认行为是即使您UsernamePasswordAuthenticationToken从中返回一个,也会很快AbstractUserDetailsAuthenticationProvider调用以再次将凭据设置为 NULL。UsernamePasswordAuthenticationToken#eraseCredentials()

因此,如果您在成功验证后不需要使用用户凭据,那么使用 NULL 凭据返回 Authentication 是相当安全的。


推荐阅读