2017-02-27 53 views
0

我只是针对即将到来的项目的一些规范,并且偶然发现了Spring Security的AuthenticationProvider接口的细节。为什么在身份验证(..)返回的身份验证对象仍然需要包含凭据?

对于方法Authentication authenticate(Authentication authentication) 返回的对象又是一个Authentication对象。根据来自Spring的java文档,它表示返回值:

返回: 包含凭据的完全身份验证对象。如果AuthenticationProvider无法支持传递的Authentication对象的身份验证,则可能返回null。在这种情况下,将尝试支持所提供的Authentication类的下一个AuthenticationProvider。

为什么在成功通过身份验证后对象仍然包含凭据?这对我没有意义。认证之后,我想立即清除有关凭证的所有信息,或者为什么不应该?

回答

1

春季安全删除敏感的凭据信息,请参阅Spring Security Reference

10.1.1上成功验证

删除证书默认情况下(使用Spring Security 3.1起)的ProviderManager将尝试清除身份验证请求返回的身份验证对象中的任何敏感凭据信息。这可以防止密码等信息被保留超过必要的时间。

例如,当您使用用户对象缓存时,这可能会导致问题,以提高无状态应用程序的性能。如果Authentication包含对高速缓存中的对象的引用(例如UserDetails实例),并且已删除其凭据,则无法再对缓存的值进行身份验证。如果您使用缓存,则需要考虑这一点。一个明显的解决方案是先创建对象的副本,无论是在缓存实现中还是在创建返回的Authentication对象的AuthenticationProvider中。或者,您可以在ProviderManager上禁用eraseCredentialsAfterAuthentication属性。有关更多信息,请参阅Javadoc。

+0

谢谢,这正是我所期望的。所以Java文档有点令人困惑,因为它明确表示“包括凭证的完全验证对象”。 –