- 浏览: 194100 次
- 性别:
- 来自: 南京
文章分类
最新评论
前言:
在之前的篇章中我们已经讲述了spring security的部分组件,接下来我们再重点查看下另外两个重要的和认证相关的接口及其实现类:AuthenticationManager, UserDetailsService 。
1.AuthenticationManager, ProviderManager 和 AuthenticationProvider
AuthenticationManager是认证的核心接口,里面只有一个方法authenticate,传入一个待认证的Authentication对象,再返回一个完全组装好带有权限信息的Authentication。那么在实际中他是如何执行的呢,还有如果我们想检查多个认证数据库,亦或者我们想使用两种或两种以上如数据库➕LDAP相结合的认证方式时该如何操作呢?
在Spring Security中AuthenticationManager的默认实现者是ProviderManager,这个类本身并不进行认证操作,而是把认证过程委托给配置好的AuthenticationProvider列表,列表中的AuthenticationProvider会轮流来尝试能否完成认证。每一个具体的AuthenticationProvider在尝试认证时要么抛出异常,要么完成认证,返回一个组装好的Authentication对象(在ProviderManager中会catch认证异常继续尝试下一个provider的认证)。最常见的认证方式就是根据传入的Authentication中的用户名,调用UserDetailsService的loadUserByUsername来获取一个UserDetails对象,如有需要,此处会接着获取用户的权限信息封装成一个具体的UserDetails对象返回到具体的AuthenticationProvider类中,接着在具体的AuthenticationProvider实现类中会判断用户输入的密码和UserDetailsService返回给我们的UserDetails中的密码是否一致(如有需求,此处会先利用PasswordEncoder对用户输入的密码加密后再和UserDetails的密码比较,关于PasswordEncoder后面会再讲述),这也是DaoAuthenticationProvider这个最常用的provider的认证处理过程。获取到的UserDetails以及他包含的权限信息将被用来组装成Authentication被存储到SecurityContext中(在我们上节讨论过的AbstractSecurityInterceptor类中做的)。
当采用spring boot的java config配置形式时,我们引入@EnableWebSecurity注解后,系统会自动为我们注册ProviderManager这个默认实现具体逻辑可参考[urlhttp://fengyilin.iteye.com/admin/blogs/2410779]spring-security(二)java config加载机制[/url],如果想追加我们自定义的provider可以使用AuthenticationManagerBuilder
另外AuthenticationManagerBuilder也为我们提供了追加常用provider的方法
如果所有的provider都不支持对当前安全对象的认证,ProviderManager将抛出一个ProviderNotFoundException异常。
在一些认证机制如基于web form提交的过滤器-UsernamePasswordAuthenticationFilter中,会注入一个ProviderManager,当需要认证时就调用ProviderManager的认证方法。有时候我们需要用的provider可以相互替换,如DaoAuthenticationProvider和LdapAuthenticationProvider会兼容所有的提供username/password的认证方式,因而他们既能用来做基于form的登录验证也可以用来做HTTP Basic认证。然而还有一些认证机制只能被特定的provider来解析,如JA-SIG CAS,通过一个service ticket来验证,所以只能使用CasAuthenticationProvider来完成认证。
2.认证成功后擦除证书信息
默认情况下,ProviderManager会尝试擦除Authentication中的敏感凭证信息(如用户密码、service ticket)。在使用缓存user的情况下,这个会带来一点点小问题,比如在无状态的web service应用中,因为在这种应用中每次都需要进行认证。这时如果凭证信息被移除,利用缓存奖不能够重新完成认证,所以在这种场合下我们要加入自己处理,一个解决方法就是在返回给ProviderManager之前在我们的缓存实现类或者在自定义的AuthenticationProvider类中先把Authentication对象copy一份,或者将ProviderManager中的eraseCredentialsAfterAuthentication设置成false(默认true);
3.DaoAuthenticationProvider
DaoAuthenticationProvider是最简单的AuthenticationProvider实现类,也是spring framewor最早支持的认证方式,他利用UserDetailsService的一个实现类(通过AuthenticationManagerBuilder的jdbcAuthentication()方法,我们会为DaoAuthenticationProvider提供一个实现了UserDetailsService 的JdbcUserDetailsManager)。DaoAuthenticationProvider还有一个可选的PasswordEncoder属性,用来对UserDetailsService获取到的UserDetails中的password进行编解码。后面我们会单独讨论PasswordEncoder这个类。
在之前的篇章中我们已经讲述了spring security的部分组件,接下来我们再重点查看下另外两个重要的和认证相关的接口及其实现类:AuthenticationManager, UserDetailsService 。
1.AuthenticationManager, ProviderManager 和 AuthenticationProvider
AuthenticationManager是认证的核心接口,里面只有一个方法authenticate,传入一个待认证的Authentication对象,再返回一个完全组装好带有权限信息的Authentication。那么在实际中他是如何执行的呢,还有如果我们想检查多个认证数据库,亦或者我们想使用两种或两种以上如数据库➕LDAP相结合的认证方式时该如何操作呢?
在Spring Security中AuthenticationManager的默认实现者是ProviderManager,这个类本身并不进行认证操作,而是把认证过程委托给配置好的AuthenticationProvider列表,列表中的AuthenticationProvider会轮流来尝试能否完成认证。每一个具体的AuthenticationProvider在尝试认证时要么抛出异常,要么完成认证,返回一个组装好的Authentication对象(在ProviderManager中会catch认证异常继续尝试下一个provider的认证)。最常见的认证方式就是根据传入的Authentication中的用户名,调用UserDetailsService的loadUserByUsername来获取一个UserDetails对象,如有需要,此处会接着获取用户的权限信息封装成一个具体的UserDetails对象返回到具体的AuthenticationProvider类中,接着在具体的AuthenticationProvider实现类中会判断用户输入的密码和UserDetailsService返回给我们的UserDetails中的密码是否一致(如有需求,此处会先利用PasswordEncoder对用户输入的密码加密后再和UserDetails的密码比较,关于PasswordEncoder后面会再讲述),这也是DaoAuthenticationProvider这个最常用的provider的认证处理过程。获取到的UserDetails以及他包含的权限信息将被用来组装成Authentication被存储到SecurityContext中(在我们上节讨论过的AbstractSecurityInterceptor类中做的)。
当采用spring boot的java config配置形式时,我们引入@EnableWebSecurity注解后,系统会自动为我们注册ProviderManager这个默认实现具体逻辑可参考[urlhttp://fengyilin.iteye.com/admin/blogs/2410779]spring-security(二)java config加载机制[/url],如果想追加我们自定义的provider可以使用AuthenticationManagerBuilder
@Autowired public void auth(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(new MyCustomProvider()); }
另外AuthenticationManagerBuilder也为我们提供了追加常用provider的方法
- inMemoryAuthentication()提供基于内存的认证方式
- jdbcAuthentication()提供基于关系数据库的认证方式
- userDetailsService(T userDetailsService)提供基于关系数据库的认证方式,并使用我们自定义的UserDetailsService
- ldapAuthentication()提供基于LDAP的认证方式
如果所有的provider都不支持对当前安全对象的认证,ProviderManager将抛出一个ProviderNotFoundException异常。
在一些认证机制如基于web form提交的过滤器-UsernamePasswordAuthenticationFilter中,会注入一个ProviderManager,当需要认证时就调用ProviderManager的认证方法。有时候我们需要用的provider可以相互替换,如DaoAuthenticationProvider和LdapAuthenticationProvider会兼容所有的提供username/password的认证方式,因而他们既能用来做基于form的登录验证也可以用来做HTTP Basic认证。然而还有一些认证机制只能被特定的provider来解析,如JA-SIG CAS,通过一个service ticket来验证,所以只能使用CasAuthenticationProvider来完成认证。
2.认证成功后擦除证书信息
默认情况下,ProviderManager会尝试擦除Authentication中的敏感凭证信息(如用户密码、service ticket)。在使用缓存user的情况下,这个会带来一点点小问题,比如在无状态的web service应用中,因为在这种应用中每次都需要进行认证。这时如果凭证信息被移除,利用缓存奖不能够重新完成认证,所以在这种场合下我们要加入自己处理,一个解决方法就是在返回给ProviderManager之前在我们的缓存实现类或者在自定义的AuthenticationProvider类中先把Authentication对象copy一份,或者将ProviderManager中的eraseCredentialsAfterAuthentication设置成false(默认true);
@Autowired public void auth(AuthenticationManagerBuilder auth) throws Exception { auth.eraseCredentials(false); }
3.DaoAuthenticationProvider
DaoAuthenticationProvider是最简单的AuthenticationProvider实现类,也是spring framewor最早支持的认证方式,他利用UserDetailsService的一个实现类(通过AuthenticationManagerBuilder的jdbcAuthentication()方法,我们会为DaoAuthenticationProvider提供一个实现了UserDetailsService 的JdbcUserDetailsManager)。DaoAuthenticationProvider还有一个可选的PasswordEncoder属性,用来对UserDetailsService获取到的UserDetails中的password进行编解码。后面我们会单独讨论PasswordEncoder这个类。
发表评论
-
spring-security(二十五)鉴权
2018-03-27 11:21 1601前言 本文将详细探讨spring security中的鉴权 ... -
test
2018-03-19 21:20 0什么是服务发现 ... -
spring-security(二十四)CSRF
2018-03-24 09:54 81641.什么是CSRF攻击 下面我们以一个具体的例子来说明这种常见 ... -
spring-security(二十三)Remember-Me认证
2018-03-09 21:06 1341前言: Remember-me认证方式指的是能在不同的会话 ... -
spring-security(二十二)基本认证和摘要认证
2018-03-06 16:58 1804前言: 在web应用中,非常流行以基本认证和摘要认证作为备 ... -
spring-security(二十一)核心Filter-UsernamePasswordAuthenticationFilter
2018-03-04 11:05 1241一、UsernamePasswordAuthenticatio ... -
spring-security(二十)核心Filter-SecurityContextPersistenceFilter
2018-02-28 21:40 1132一、SecurityContextPersistenceFil ... -
spring-security(十九)核心Filter-ExceptionTranslationFilter
2018-02-27 16:31 2064前言: 在spring的安全 ... -
spring-security(十八)核心Filter-FilterSecurityInterceptor
2018-02-25 10:59 2350前言: 当用spring secur ... -
spring-security(二十六)整合CAS 实现SSO
2018-04-05 18:09 12461.cas 认证流程 2.spring security ... -
spring-security(十七)Filter顺序及简介
2018-02-22 18:16 7904前言: spring security在 ... -
spring-security(十六)Filter配置原理
2018-02-21 15:18 2387前言: spring security最常见的应用场景还是 ... -
spring-security(十五) Password编码
2018-02-19 15:15 1228前言: 在实际应用中 ... -
spring-security(十四)UserDetailsService
2018-02-19 11:35 1476前言: 作为spring security的核心类,大多数 ... -
spring-security(十二)鉴权方式概述
2018-02-18 10:42 2527前言: 本文主要讲述在spring security鉴权的 ... -
spring-security(十一)Web应用认证过程
2018-02-17 17:17 1239前言: 本文将探讨当 ... -
spring-security(十)基本认证过程
2018-02-17 13:55 2108前言: 在spring security中认证具体指的是什 ... -
spring-security(九)-核心组件
2018-02-17 10:46 870前言: 本文主要介绍在spring security中的几 ... -
spring-security(八)java config-sample之cas client
2018-02-16 11:26 2071前言: SSO英文全称Single Sign On,单点登 ... -
spring-security(七)java config-sample之concurrency
2018-02-15 10:51 673前言: 在实际应用中,我们可能会限制一个用户同时登录同一个 ...
相关推荐
2. **spring-beans-3.1.2.RELEASE.jar**:包含Spring处理bean定义和依赖注入的核心类,使得Spring Security可以动态地管理其组件。 3. **spring-web-3.1.2.RELEASE.jar**:提供了处理HTTP请求和响应的能力,以及...
3. **spring-security-core-tiger-2.0.5.RELEASE-tests.jar**:这是一个测试库,包含了用于测试Spring Security核心组件的类和方法。开发人员可以使用这些测试类来验证他们的Spring Security配置是否正确,或者进行...
1. **用户认证**:Spring Security 提供了多种认证机制,包括基于内存的用户细节服务、数据库连接的用户细节服务,甚至可以自定义认证提供者。它支持基本认证、表单登录、OAuth2等多种认证方式,确保只有经过验证的...
Spring Security OAuth2是一个广泛使用的Java库,用于在Spring应用程序中实现OAuth2协议,提供安全授权服务。OAuth2是一种授权框架,允许第三方应用在用户许可的情况下访问其私有资源,如在社交媒体上的数据。2.0.3....
Spring Security OAuth2允许开发者自定义各种组件,如TokenEnhancer(增强令牌)、UserDetailsService(用户详情服务)等,以满足特定需求。 6. **spring-security-oauth-master** 文件夹中可能包含的内容: - 源...
这些jar包共同构成了Spring Security 3.1.4的完整框架,为企业级应用提供了强大的安全基础设施,涵盖了从Web应用到分布式系统,从本地用户认证到第三方服务集成的各种安全需求。开发者可以根据实际项目需求选择和...
Spring Security可与OAuth2集成,实现第三方登录和服务提供者的身份验证。 9. **自定义扩展**: 开发者可以自定义认证和授权逻辑,例如自定义认证提供者、权限评估器等。 10. **模块化设计**: Spring Security...
3. **过滤器链(Filter Chain)**:Spring Security的核心组件之一是过滤器链,它由多个过滤器组成,如`UsernamePasswordAuthenticationFilter`和`HttpSessionAuthenticationStrategy`等。这些过滤器负责处理HTTP...
- `spring-security-core-4.0.0.CI-SNAPSHOT-javadoc.jar`:包含Spring Security核心模块的Java文档,方便开发者查阅API和理解其功能。 - `spring-security-core-4.0.0.CI-SNAPSHOT-sources.jar`:提供源代码,...
本项目“spring-security-oauth2-authorization-server”将带你深入理解如何利用Spring Security OAuth2构建一个授权服务器,以保护你的API并提供安全的访问控制。 OAuth2是一种开放标准,用于授权第三方应用访问...
《Spring Security核心库3.1.0.RC1详解》 Spring Security是Java平台上的一款强大且高度可配置的安全框架,用于解决Web应用和企业级应用的安全需求。在本篇文章中,我们将深入探讨Spring Security的核心库——`...
2. **spring-security-core**:这是Spring Security的基础模块,提供了安全核心服务,如安全性上下文、访问决策管理器、权限评估器等。它实现了基于角色的访问控制(RBAC)模型,处理用户、权限、角色等核心概念。 ...
三、配置Spring Security LDAP 1. 配置ContextSource:在Spring Security的配置文件中,需要定义一个ContextSource,指定连接到的LDAP服务器以及基础DN。 2. 配置LdapAuthenticationProvider:该组件处理用户的登录...
三、Spring Security与Spring Boot整合 1. 添加依赖 首先,我们需要在Spring Boot的pom.xml文件中添加Spring Security的依赖。这通常包括`spring-boot-starter-security`和`spring-boot-starter-web`,确保Spring ...
首先,`spring-security-web`是Spring Security的核心库,它提供了Web应用程序的基本安全功能,如HTTP安全过滤器链,登录页面处理,会话管理以及基于角色的访问控制(RBAC)。在`3.1.2`版本中,它包括了以下主要模块...
这个zip包包含了Spring Security的核心库、文档、示例代码和其他必要的资源,便于开发者下载和学习。 Spring Security的主要功能包括: 1. **身份验证**:它提供了多种认证机制,如基于密码的认证、Remember Me...
《Spring Security核心模块详解》 在Java开发领域,Spring Security是一个强大的、高度可配置的安全框架,用于保护Web应用程序免受各种安全威胁。本篇将详细探讨`spring-security-core-2.0.5.RELEASE.src`这个源...
首先,Spring Security的核心概念包括安全性上下文、过滤器链和访问决策管理器。安全性上下文存储当前请求的认证和授权信息。过滤器链是Spring Security实现其功能的关键,它由一系列安全过滤器组成,这些过滤器在...
本文将深入探讨Spring Security的核心概念、主要功能以及与Spring框架的整合。 **1. Spring Security简介** Spring Security是基于Spring框架的安全组件,原名为Acegi Security。它为Web应用程序提供了全面的安全...
Spring Boot简化了Java应用的开发过程,而Spring Security则是一个功能丰富的安全框架,为Web应用程序提供认证和授权服务。 首先,我们需要理解Spring Boot的核心概念。Spring Boot通过自动配置和起步依赖(Starter...