身份验证
Spring Security 为 认证 提供了全面的支持。我们首先讨论整体的 Servlet 认证架构。正如你可能预料到的,这部分内容较为抽象,描述了架构而没有太多关于具体流程的应用讨论。
如果你愿意,你可以参考认证机制来了解用户可以进行认证的具体方式。这些章节专注于你可能希望采用的具体认证方式,并指向架构章节来描述特定流程是如何工作的。
身份验证机制
-
用户名和密码 - 如何使用用户名/密码进行身份验证
-
OAuth 2.0 登录 - 使用 OpenID Connect 和非标准 OAuth 2.0 登录(例如 GitHub)
-
SAML 2.0 登录 - SAML 2.0 登录
-
中央认证服务器 (CAS) - 中央认证服务器 (CAS) 支持
-
记住我 - 如何在会话过期后记住用户
-
JAAS 身份验证 - 使用 JAAS 进行身份验证
-
预身份验证场景 - 使用外部机制(如 SiteMinder 或 Java EE 安全)进行身份验证,但仍使用 Spring Security 进行授权和防止常见攻击。
-
X509 身份验证 - X509 身份验证
章节摘要
📄️ 认证架构
本讨论在《Servlet 安全:大局观》的基础上,进一步描述了 Spring Security 在 Servlet 身份验证中使用的主要架构组件。如果你需要具体的流程来解释这些组件是如何组合在一起的,请查看与特定身份验证机制相关的章节。
🗃️ 用户名/密码
2 个项目
📄️ 持久化
用户首次请求受保护的资源时,系统会提示其输入凭证。提示输入凭证的最常见方法之一是将用户重定向到登录页面。未认证用户请求受保护资源时的简要 HTTP 交换过程可能如下所示:
📄️ Passkeys
Spring Security 提供了对 passkeys 的支持。Passkeys 是一种比密码更安全的认证方法,并且是使用 WebAuthn 构建的。
📄️ 一次性令牌
Spring Security 通过 oneTimeTokenLogin() DSL 提供了一次性令牌 (OTT) 身份验证的支持。在深入实现细节之前,重要的是要明确框架内 OTT 功能的范围,突出支持和不支持的内容。
📄️ 会话管理
一旦你有了一个可以验证请求的应用程序,重要的是要考虑如何持久化和恢复该验证结果,以便在未来的请求中使用。
📄️ 记住我
记住我或持久登录认证指的是网站能够在会话之间记住主体的身份。这通常是通过向浏览器发送 cookie 来实现的,该 cookie 在未来的会话中被检测到,并导致自动登录发生。Spring Security 提供了这些操作所需的基本钩子,并且有两个具体的记住我实现。一种使用哈希来保护基于 cookie 的令牌的安全性,另一种使用数据库或其他持久存储机制来存储生成的令牌。
📄️ 匿名者
通常认为,采用“默认拒绝”的安全策略是一种良好的实践,在这种策略中,你明确指定允许的内容,并拒绝其他所有内容。定义未认证用户可以访问的内容也类似,特别是对于 Web 应用程序。许多站点要求用户除了少数几个 URL(例如首页和登录页面)之外必须进行认证。在这种情况下,为这些特定的 URL 定义访问配置属性比为每个受保护资源定义要容易得多。换句话说,有时最好说默认需要 ROLE\_SOMETHING,并只允许某些例外情况,比如登录、注销和应用程序的首页。你也可以完全将这些页面从过滤器链中排除,从而绕过访问控制检查,但这可能由于其他原因而不理想,特别是如果这些页面对已认证用户的行为有所不同。
📄️ 预认证
示例包括 X.509、Siteminder 以及应用程序运行所在的 Java EE 容器进行的认证。当使用预认证时,Spring Security 必须:
📄️ JAAS
Spring Security 提供了一个包,用于将认证请求委派给 Java 认证和授权服务 (JAAS)。本节将讨论该包。
📄️ CAS
JA-SIG 产生了一个称为 CAS 的企业级单点登录系统。与其他方案不同,JA-SIG 的中央认证服务是开源的、广泛使用的、易于理解的、平台独立的,并且支持代理功能。Spring Security 完全支持 CAS,并提供了从 Spring Security 的单应用部署到由企业级 CAS 服务器保护的多应用部署的简单迁移路径。
📄️ X509
X.509 证书认证最常见的用途是在使用 SSL 时验证服务器的身份,最常见的情况是使用浏览器通过 HTTPS 进行访问。浏览器会自动检查服务器提供的证书是否由其维护的受信任的证书颁发机构列表中的某一个机构签发(数字签名)。
📄️ Run-As
AbstractSecurityInterceptor 能够在安全对象回调阶段临时替换 SecurityContext 和 SecurityContextHolder 中的 Authentication 对象。这仅在原始 Authentication 对象成功通过 AuthenticationManager 和 AccessDecisionManager 处理后才会发生。RunAsManager 指示在 SecurityInterceptorCallback 期间应使用的替代 Authentication 对象(如果有)。
📄️ 登出
在用户可以登录的应用程序中,他们也应该能够注销。
📄️ 认证事件
对于每次成功或失败的认证,将分别触发 AuthenticationSuccessEvent 或 AuthenticationFailureEvent 事件。