在AuthenticationProvider中成功进行身份验证后,是否有必要将原始凭据放入UsernamePasswordAuthenticationToken中?

时间:2019-05-27 00:33:42

标签: spring spring-security

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

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

AbstractUserDetailsAuthenticationProvider中的一条评论使我感到困惑:

  

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

1 个答案:

答案 0 :(得分:4)

摘自this处的以下注释:

  

更广泛地讲:也许确实有需要身份验证的提供程序   凭证,即使会话已通过身份验证,或者   在其他一些用例中,需要具有凭据   出于其他目的,但是(从我的幼稚角度来看)   身份验证后,永远不需要用户凭据   成功完成,所以也许所有身份验证管理器都应该   清除身份验证实例中的凭据,无论   涉及的代币/提供者类型?

根据我在current source codes中看到的内容,默认行为是即使您从Promise.all返回一个UsernamePasswordAuthenticationToken,它也会很快调用AbstractUserDetailsAuthenticationProvider来设置凭据再次为NULL。

因此,如果您不需要在成功身份验证后使用用户凭据,则返回带有NULL凭据的身份验证是相当安全的。