【问题标题】:Spring Security Authentication and User InterfacesSpring Security 身份验证和用户界面
【发布时间】:2020-11-04 02:45:22
【问题描述】:

根据 Spring Security,如果身份验证由外部 Authentication Provider 完成,则使用 Authentication Provider。 Authentication 之后,Spring Security 会得到封装了用户信息的 Authentication 对象。

如果 Spring Security 框架进行身份验证,则用户信息被封装在 User 接口的实例中(例如 UserDetails 类,它是默认实现)。

我的问题是 - 为什么 Spring Security 框架不能使用一致的方法?为什么他们不能在所有情况下都使用 UserDetails 而不是 Authentication 对象?有什么原因吗?

【问题讨论】:

    标签: spring spring-security


    【解决方案1】:

    根据 Spring 文档

    public interface Authentication extends Principal, Serializable
    

    在 AuthenticationManager.authenticate(Authentication) 方法处理了请求后,代表身份验证请求或经过身份验证的主体的令牌。 一旦请求通过身份验证,身份验证通常将存储在由正在使用的身份验证机制的 SecurityContextHolder 管理的线程本地 SecurityContext 中。通过创建 Authentication 实例并使用代码,可以在不使用 Spring Security 的身份验证机制之一的情况下实现显式身份验证:

     SecurityContextHolder.getContext().setAuthentication(anAuthentication);
    

    更多详情请参考https://docs.spring.io/spring-security/site/docs/4.2.15.RELEASE/apidocs/org/springframework/security/core/Authentication.html

    说明:

    仅当用户使用有效凭据进行身份验证时,身份验证对象才会设置为本地安全上下文。它充当令牌。在 UserDetails 的情况下,我们无法知道用户是否经过身份验证。

    你也可以把它看成一个单一职责原则,其中UserDetails类职责是管理用户细节,Authentication职责是处理真实性。

    【讨论】:

    • 你能详细说明一下吗?
    • 感谢 Pradys,有道理。那么,如果我们使用 UserDetails,我可以假设 Spring Security 可能会在内部创建一个 Authentication 对象并将其设置在内部的安全上下文中吗?
    • @SRaj 是的,Spring 将在内部创建身份验证对象并在上下文中设置。但是,如果您编写自己的身份验证过滤器,则需要手动将身份验证对象设置为上下文。如果它符合您的查询,请投赞成票或接受答案。
    猜你喜欢
    • 1970-01-01
    • 2013-10-30
    • 2014-04-07
    • 2012-02-18
    • 2019-01-24
    • 2014-03-18
    • 2011-10-17
    • 2014-03-26
    • 2017-12-21
    相关资源
    最近更新 更多