- 浏览: 190095 次
- 性别:
- 来自: 南京
文章分类
最新评论
前言:
在之前的篇章中我们已经讲述了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 1559前言 本文将详细探讨spring security中的鉴权 ... -
test
2018-03-19 21:20 0什么是服务发现 ... -
spring-security(二十四)CSRF
2018-03-24 09:54 81331.什么是CSRF攻击 下面我们以一个具体的例子来说明这种常见 ... -
spring-security(二十三)Remember-Me认证
2018-03-09 21:06 1299前言: Remember-me认证方式指的是能在不同的会话 ... -
spring-security(二十二)基本认证和摘要认证
2018-03-06 16:58 1771前言: 在web应用中,非常流行以基本认证和摘要认证作为备 ... -
spring-security(二十一)核心Filter-UsernamePasswordAuthenticationFilter
2018-03-04 11:05 1205一、UsernamePasswordAuthenticatio ... -
spring-security(二十)核心Filter-SecurityContextPersistenceFilter
2018-02-28 21:40 1074一、SecurityContextPersistenceFil ... -
spring-security(十九)核心Filter-ExceptionTranslationFilter
2018-02-27 16:31 2004前言: 在spring的安全 ... -
spring-security(十八)核心Filter-FilterSecurityInterceptor
2018-02-25 10:59 2275前言: 当用spring secur ... -
spring-security(二十六)整合CAS 实现SSO
2018-04-05 18:09 12151.cas 认证流程 2.spring security ... -
spring-security(十七)Filter顺序及简介
2018-02-22 18:16 7814前言: spring security在 ... -
spring-security(十六)Filter配置原理
2018-02-21 15:18 2352前言: spring security最常见的应用场景还是 ... -
spring-security(十五) Password编码
2018-02-19 15:15 1188前言: 在实际应用中 ... -
spring-security(十四)UserDetailsService
2018-02-19 11:35 1443前言: 作为spring security的核心类,大多数 ... -
spring-security(十二)鉴权方式概述
2018-02-18 10:42 2506前言: 本文主要讲述在spring security鉴权的 ... -
spring-security(十一)Web应用认证过程
2018-02-17 17:17 1216前言: 本文将探讨当 ... -
spring-security(十)基本认证过程
2018-02-17 13:55 2069前言: 在spring security中认证具体指的是什 ... -
spring-security(九)-核心组件
2018-02-17 10:46 841前言: 本文主要介绍在spring security中的几 ... -
spring-security(八)java config-sample之cas client
2018-02-16 11:26 2038前言: SSO英文全称Single Sign On,单点登 ... -
spring-security(七)java config-sample之concurrency
2018-02-15 10:51 644前言: 在实际应用中,我们可能会限制一个用户同时登录同一个 ...
相关推荐
spring security oauth2的源码,方便研究,备份一下。
spring-security-4.2.2.RELEASE相关的jar包和源码。包含核心的认证和连接控制类和接口,用spring security的框架都需要这些。支持单独的应用程序,远程客户端,方法(服务层) 安全和jdbc的基本服务.
Spring Security-3.0.1 中文官方文档(翻译版) 这次发布的Spring Security-3.0.1 是一个bug fix 版,主要是对3.0 中存在的一些问题进 行修 正。文档中没有添加新功能的介绍,但是将之前拼写错误的一些类名进行...
即使用一个基于Spring3的web工程作为基础,以理解使用Spring Security3使其保证安全的概念和策略。 不管你是不是已经使用Spring Security还是只是对这个软件有兴趣,就都会在本书中得到有用的信息。 在本节的内容中,你...
基于Spring Boot Security 2.5.8,扩展了核心功能,支持用户名,手机号,邮箱登录,以及记住密码,JWT等功能。有完整的数据库脚本及功能演示。
1.1. Spring Security是什么? 1.2. 历史 1.3. 发行版本号 1.4. 获得Spring Security 1.4.1. 项目模块 1.4.1.1. Core - spring-security-core.jar 1.4.1.2. Web - spring-security-web.jar 1.4.1.3. ...
核心 - spring-security-core.jar 25 远程处理 - spring-security-remoting.jar 25 Web - spring-security-web.jar 25 配置 - spring-security-config.jar 26 LDAP - spring-security-ldap.jar 26 ACL - spring-...
Grails Spring安全核心插件 请参阅以获取更多信息。 分支机构 master与Grails 4.x兼容 3.3.x使用Grails 3.3.x兼容 3.2.x使用Grails 3.2.x中兼容
Springboot整合Spring security+Oauth2+JWT搭建认证服务器,网关,微服务之间权限认证及授权。 OAuth2是一个关于授权的开放标准,核心思路是通过各类认证手段(具体什么手段OAuth2不关心)认证用户身份,并颁发...
1.1. Spring Security是什么? 1.2. 历史 1.3. 发行版本号 1.4. 获得Spring Security 1.4.1. 项目模块 1.4.1.1. Core - spring-security-core.jar 1.4.1.2. Web - spring-security-web.jar 1.4.1.3. Config -...
springsecurity是一个功能强大且高度可定制的身份验证和访问控制框架。springsecurity是一个专注于为Java应用程序提供身份验证和授权的框架。与所有Spring项目一样,Spring安全性的真正威力在于它可以很容易地扩展以...
三:SpringSecurity配置 通过SpringSecurity的配置,将上面的方法组合在一起。 这是标准的SpringSecurity配置内容,就不在详细说明。注意其中的 .addFilter(new JWTLoginFilter(authenticationManager())) ....
该存储库包含3个项目: thymeleaf-extras-springsecurity3与Spring Security 3.x集成thymeleaf-extras-springsecurity4用于与Spring Security 4.x集成thymeleaf-extras-springsecurity5与Spring Security 5.x集成...
Spring Security模块配置 模组名称 解释 Spring安全核心 由核心组件组成,以实现身份验证和授权功能 Spring安全网 包含实现Web应用程序安全功能的组件 弹簧安全配置 由组件组成,以支持每个模块提供的组件配置(支持...
renren-security是一个轻量级权限管理系统,其核心设计目标是开发迅速、学习简单、轻量级、易扩展,提供AdminLTE、Layui两套主题供选择。使用renren-security搭建项目,只需编写30%左右代码,其余的代码交给系统自动...
Spring Security 安全管理
Spring Security是什么? 历史 发布版本号 Getting Spring Security Spring Security 4.1新特性 Java 配置提升 Web应用程序安全性提升 授权改进 密码模块的改进 测试的改进 一般的改进 样品和指南 (Start Here) Java ...
核心框架: Spring、SpringBoot、SpringMVC 持久层: MyBatis、MyBatisPlus 权限框架: Spring Security、jjwt 数据库连接池: Druid
Spring Security Spring HATEOAS Spring Social Spring AMQP Spring Mobile Spring for Android Spring Web Flow Spring Web Services Spring LDAP Spring ...