根据Spring Security,如果认证是由外部认证提供者完成的,则使用认证提供者。身份验证后,Spring Security将获得一个Authentication对象,该对象封装了用户信息。
如果Spring Security框架进行身份验证,则用户信息将封装在User接口的实例中(例如,UserDetails类是默认实现)。
我的问题是-为什么Spring Security框架不能使用一致的方法?为什么他们在所有情况下都不能使用UserDetails代替Authentication对象?有什么理由吗?
答案 0 :(得分:1)
根据Spring文档
public interface Authentication extends Principal, Serializable
代表已通过AuthenticationManager.authenticate(Authentication)方法处理了请求的身份验证请求或已验证主体的令牌。 一旦对请求进行身份验证,身份验证通常将通过使用的身份验证机制存储在由SecurityContextHolder管理的线程本地SecurityContext中。通过创建Authentication实例并使用以下代码,无需使用Spring Security的一种身份验证机制即可实现显式身份验证:
SecurityContextHolder.getContext().setAuthentication(anAuthentication);
说明:
仅当使用有效凭据对用户进行身份验证时,身份验证对象才会设置为本地安全上下文。它充当令牌。在类似UserDetails的情况下,我们无法知道用户是否已通过身份验证。
您还可以将其视为单一职责原则,其中UserDetails类的职责是管理用户详细信息,身份验证职责是处理真实性。