- 浏览: 197627 次
- 性别:
- 来自: 南京
-
文章分类
最新评论
前言:
在之前的篇章中我们已经讲述了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 1633前言 本文将详细探讨spring security中的鉴权 ... -
test
2018-03-19 21:20 0什么是服务发现 ... -
spring-security(二十四)CSRF
2018-03-24 09:54 81931.什么是CSRF攻击 下面我们以一个具体的例子来说明这种常见 ... -
spring-security(二十三)Remember-Me认证
2018-03-09 21:06 1366前言: Remember-me认证方式指的是能在不同的会话 ... -
spring-security(二十二)基本认证和摘要认证
2018-03-06 16:58 1841前言: 在web应用中,非常流行以基本认证和摘要认证作为备 ... -
spring-security(二十一)核心Filter-UsernamePasswordAuthenticationFilter
2018-03-04 11:05 1271一、UsernamePasswordAuthenticatio ... -
spring-security(二十)核心Filter-SecurityContextPersistenceFilter
2018-02-28 21:40 1161一、SecurityContextPersistenceFil ... -
spring-security(十九)核心Filter-ExceptionTranslationFilter
2018-02-27 16:31 2124前言: 在spring的安全 ... -
spring-security(十八)核心Filter-FilterSecurityInterceptor
2018-02-25 10:59 2401前言: 当用spring secur ... -
spring-security(二十六)整合CAS 实现SSO
2018-04-05 18:09 12731.cas 认证流程 2.spring security ... -
spring-security(十七)Filter顺序及简介
2018-02-22 18:16 7962前言: spring security在 ... -
spring-security(十六)Filter配置原理
2018-02-21 15:18 2417前言: spring security最常见的应用场景还是 ... -
spring-security(十五) Password编码
2018-02-19 15:15 1249前言: 在实际应用中 ... -
spring-security(十四)UserDetailsService
2018-02-19 11:35 1507前言: 作为spring security的核心类,大多数 ... -
spring-security(十二)鉴权方式概述
2018-02-18 10:42 2549前言: 本文主要讲述在spring security鉴权的 ... -
spring-security(十一)Web应用认证过程
2018-02-17 17:17 1270前言: 本文将探讨当 ... -
spring-security(十)基本认证过程
2018-02-17 13:55 2151前言: 在spring security中认证具体指的是什 ... -
spring-security(九)-核心组件
2018-02-17 10:46 898前言: 本文主要介绍在spring security中的几 ... -
spring-security(八)java config-sample之cas client
2018-02-16 11:26 2106前言: SSO英文全称Single Sign On,单点登 ... -
spring-security(七)java config-sample之concurrency
2018-02-15 10:51 714前言: 在实际应用中,我们可能会限制一个用户同时登录同一个 ...
相关推荐
内容概要:本文详细介绍了基于MATLAB GUI界面和卷积神经网络(CNN)的模糊车牌识别系统。该系统旨在解决现实中车牌因模糊不清导致识别困难的问题。文中阐述了整个流程的关键步骤,包括图像的模糊还原、灰度化、阈值化、边缘检测、孔洞填充、形态学操作、滤波操作、车牌定位、字符分割以及最终的字符识别。通过使用维纳滤波或最小二乘法约束滤波进行模糊还原,再利用CNN的强大特征提取能力完成字符分类。此外,还特别强调了MATLAB GUI界面的设计,使得用户能直观便捷地操作整个系统。 适合人群:对图像处理和深度学习感兴趣的科研人员、高校学生及从事相关领域的工程师。 使用场景及目标:适用于交通管理、智能停车场等领域,用于提升车牌识别的准确性和效率,特别是在面对模糊车牌时的表现。 其他说明:文中提供了部分关键代码片段作为参考,并对实验结果进行了详细的分析,展示了系统在不同环境下的表现情况及其潜在的应用前景。
嵌入式八股文面试题库资料知识宝典-计算机专业试题.zip
嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_3.zip
内容概要:本文深入探讨了一款额定功率为4kW的开关磁阻电机,详细介绍了其性能参数如额定功率、转速、效率、输出转矩和脉动率等。同时,文章还展示了利用RMxprt、Maxwell 2D和3D模型对该电机进行仿真的方法和技术,通过外电路分析进一步研究其电气性能和动态响应特性。最后,文章提供了基于RMxprt模型的MATLAB仿真代码示例,帮助读者理解电机的工作原理及其性能特点。 适合人群:从事电机设计、工业自动化领域的工程师和技术人员,尤其是对开关磁阻电机感兴趣的科研工作者。 使用场景及目标:适用于希望深入了解开关磁阻电机特性和建模技术的研究人员,在新产品开发或现有产品改进时作为参考资料。 其他说明:文中提供的代码示例仅用于演示目的,实际操作时需根据所用软件的具体情况进行适当修改。
少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 转瞬即逝.zip
内容概要:本文详细介绍了基于PID控制器的四象限直流电机速度驱动控制系统仿真模型及其永磁直流电机(PMDC)转速控制模型。首先阐述了PID控制器的工作原理,即通过对系统误差的比例、积分和微分运算来调整电机的驱动信号,从而实现转速的精确控制。接着讨论了如何利用PID控制器使有刷PMDC电机在四个象限中精确跟踪参考速度,并展示了仿真模型在应对快速负载扰动时的有效性和稳定性。最后,提供了Simulink仿真模型和详细的Word模型说明文档,帮助读者理解和调整PID控制器参数,以达到最佳控制效果。 适合人群:从事电力电子与电机控制领域的研究人员和技术人员,尤其是对四象限直流电机速度驱动控制系统感兴趣的读者。 使用场景及目标:适用于需要深入了解和掌握四象限直流电机速度驱动控制系统设计与实现的研究人员和技术人员。目标是在实际项目中能够运用PID控制器实现电机转速的精确控制,并提高系统的稳定性和抗干扰能力。 其他说明:文中引用了多篇相关领域的权威文献,确保了理论依据的可靠性和实用性。此外,提供的Simulink模型和Word文档有助于读者更好地理解和实践所介绍的内容。
嵌入式八股文面试题库资料知识宝典-2013年海康威视校园招聘嵌入式开发笔试题.zip
少儿编程scratch项目源代码文件案例素材-驾驶通关.zip
小区开放对周边道路通行能力影响的研究.pdf
内容概要:本文探讨了冷链物流车辆路径优化问题,特别是如何通过NSGA-2遗传算法和软硬时间窗策略来实现高效、环保和高客户满意度的路径规划。文中介绍了冷链物流的特点及其重要性,提出了软时间窗概念,允许一定的配送时间弹性,同时考虑碳排放成本,以达到绿色物流的目的。此外,还讨论了如何将客户满意度作为路径优化的重要评价标准之一。最后,通过一段简化的Python代码展示了遗传算法的应用。 适合人群:从事物流管理、冷链物流运营的专业人士,以及对遗传算法和路径优化感兴趣的科研人员和技术开发者。 使用场景及目标:适用于冷链物流企业,旨在优化配送路线,降低运营成本,减少碳排放,提升客户满意度。目标是帮助企业实现绿色、高效的物流配送系统。 其他说明:文中提供的代码仅为示意,实际应用需根据具体情况调整参数设置和模型构建。
少儿编程scratch项目源代码文件案例素材-恐怖矿井.zip
内容概要:本文详细介绍了基于STM32F030的无刷电机控制方案,重点在于高压FOC(磁场定向控制)技术和滑膜无感FOC的应用。该方案实现了过载、过欠压、堵转等多种保护机制,并提供了完整的源码、原理图和PCB设计。文中展示了关键代码片段,如滑膜观测器和电流环处理,以及保护机制的具体实现方法。此外,还提到了方案的移植要点和实际测试效果,确保系统的稳定性和高效性。 适合人群:嵌入式系统开发者、电机控制系统工程师、硬件工程师。 使用场景及目标:适用于需要高性能无刷电机控制的应用场景,如工业自动化设备、无人机、电动工具等。目标是提供一种成熟的、经过验证的无刷电机控制方案,帮助开发者快速实现并优化电机控制性能。 其他说明:提供的资料包括详细的原理图、PCB设计文件、源码及测试视频,方便开发者进行学习和应用。
基于有限体积法Godunov格式的管道泄漏检测模型研究.pdf
嵌入式八股文面试题库资料知识宝典-CC++笔试题-深圳有为(2019.2.28)1.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 V1.5.zip
Android系统开发_Linux内核配置_USB-HID设备模拟_通过root权限将Android设备转换为全功能USB键盘的项目实现_该项目需要内核支持configFS文件系统
C# WPF - LiveCharts Project
少儿编程scratch项目源代码文件案例素材-恐怖叉子 动画.zip
嵌入式八股文面试题库资料知识宝典-嵌⼊式⼯程师⾯试⾼频问题.zip