身份验证
Spring Security 为身份验证提供了全面的支持。我们首先讨论整体的Servlet 身份验证架构。正如您可能预料的那样,本节内容较为抽象,主要描述架构,而不会过多讨论其如何应用于具体流程。
如果您愿意,可以参考认证机制了解用户进行身份验证的具体方式。这些章节重点介绍了您可能希望使用的特定认证方法,并会回溯到架构章节来说明具体流程的工作原理。
认证机制
-
用户名与密码 - 如何使用用户名/密码进行身份验证
-
OAuth 2.0 登录 - 通过 OpenID Connect 及非标准 OAuth 2.0 登录(例如 GitHub)实现 OAuth 2.0 登录
-
SAML 2.0 登录 - SAML 2.0 登录
-
中央认证服务器 (CAS) - 中央认证服务器 (CAS) 支持
-
记住我 - 如何在会话过期后保持用户登录状态
-
JAAS 身份验证 - 使用 JAAS 进行身份验证
-
预认证场景 - 通过外部机制(如 SiteMinder 或 Java EE 安全机制)进行身份验证,同时仍使用 Spring Security 进行授权和常见攻击防护
-
X509 身份验证 - X509 身份验证
章节总结
📄️ 认证架构
本讨论在《Servlet 安全性:整体概览》的基础上,进一步阐述 Spring Security 在 Servlet 身份验证中使用的主要架构组件。如果您需要了解这些组件如何协同工作的具体流程,请参阅《身份验证机制》相关章节。
🗃️ 用户名/密码
2 个项目
📄️ 多因素身份验证
多因素认证(MFA)要求用户提供多种认证要素以完成身份验证。OWASP将认证要素分为以下几类:
📄️ 持久化
当用户首次请求受保护资源时,系统会提示其提供凭据。最常见的凭据提示方式之一是将用户重定向至登录页面。以下是一个未认证用户请求受保护资源时简化的HTTP交互示例:
📄️ 通行密钥
Spring Security 提供了对通行密钥的支持。通行密钥是一种比密码更安全的身份验证方法,基于 WebAuthn 构建。
📄️ 一次性令牌
Spring Security 通过 oneTimeTokenLogin() DSL 提供对一次性令牌(OTT)认证的支持。在深入实现细节之前,有必要先阐明该框架内 OTT 功能的范围,明确其支持与不支持的功能。
📄️ 会话管理
一旦应用程序具备了请求认证功能,下一步就需要考虑如何持久化认证结果,并在后续请求中恢复认证状态。
📄️ 记住我
记住我(Remember-me)或持久登录认证指的是网站能够在不同会话之间记住用户的身份。这通常通过向浏览器发送一个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 事件。