UsernamePasswordAuthenticationFilter 登录认证

转载 2016年08月31日 14:52:43

UsernamePasswordAuthenticationFilter本身不是过滤器,而是继承了AbstractAuthenticationProcessingFilter才拥有过滤器的性能。

认证过程如下

一、先判断请求(请求必须是post请求)地址是否为/j_spring_security_check,如果不是,则放行,进入下一个过滤器,是则进行校验。

二、验证用户密码信息并返回Authentication类,在验证过程中如果失败则捕获异常进行处理(执行unsuccessfulAuthentication方法调转到配置中的错误链接),如果验证成功,则将调用SessionAuthenticationStrategy中的方法onAuthentication()判断用户能否重复登陆,是否二次登陆——根据你的配置文件决定,如果用户登陆满足条件则再执行successfulAuthentication(配置中的验证成功链接),如果失败则还是执行unsuccessfulAuthentication方法

详细说明:

1、用户密码认证过程

    AbstractAuthenticationProcessingFilter调用UsernamePasswordAuthenticationFilter中的attemptAuthentication方法,将表单请求的信息(用户、密码等信息)赋值给UsernamePasswordAuthenticationToken(authRequest),然后调用AbstractAuthenticationProcessingFilter中的AuthenticationManager类中的(默认是ProviderManager类)方法——getAuthenticationManager().authenticate(authRequest)对用户密码的正确性进行验证,认证失败就抛出异常,成功就返回Authentication对象。

    AuthenticationManager说明:顾名思义就是认证管理器,用于管理使用什么AuthenticationProvider验证用户的合法性,它拥有2个重要的参数类:

        List<AuthenticationProvider> providers;AuthenticationManager parent

        其中providers是AuthenticationProvider(接口,认证实现者)的集合

         AuthenticationProvider的作用:可以处理一个特定的Authentication,实现身份验证。它有2个方法

         Authentication authenticate(Authentication authentication) throws AuthenticationException;(根据authentication信息实现身份验证)

         boolean supports(Class<?> authentication); 用于判断该AnonymousAuthenticationProvider能够验证某种类型的Authentication

        说明:Authentication可以拥有多种类型,不同的类型使用不同的AuthenticationProvider

        比如DaoAuthenticationProvider支持使用UsernamePasswordAuthenticationToken,AnonymousAuthenticationProvider支持AnonymousAuthenticationToken等

    AuthenticationManager的方法authenticate执行逻辑如下(以DaoAuthenticationProvider为例):

(1)、判断是否有Authentication 对应的AuthenticationProvider,有就执行AuthenticationProvider的authenticate方法,没有就获取父类AuthenticationManager,查看父类中是否有Authentication 对应的AuthenticationProvider,如果也没有则抛出ProviderNotFoundException异常

(2)执行AuthenticationProvider的authenticate方法

        1、根据输入名,查看缓存中是否已经有有用户实体对象,如果有,则对密码重新验证;如果没有,则进行用户的信息验证,及执行DaoAuthenticationProvider中的retrieveUser方法,获取一个UserDetails对象,如果UserDetails对象为null或者获取时出错就抛出异常UsernameNotFoundException或AuthenticationServiceException异常,然后一些属性验证之后,对用户密码进行验证。

        2、给新获取的UserDetails对象放入缓存中

        3、新建一个UsernamePasswordAuthenticationToken一个对象,将authenticated设为true(原来传入的UsernamePasswordAuthenticationToken对象authenticated为false)并返回


2、SessionAuthenticationStrategy.onAuthentication处理过程(主要处理一个用户是否可以同时多次登陆

    1、checkAuthenticationAllowed方法

     根据maximumSessions和exceptionIfMaximumExceeded的设置判断用户是否多次登陆,是否超过maximumSessions同时登陆了,是否限制用户二次登陆(限制的话则第二次登陆的时候会抛出SessionAuthenticationException异常)还是第二次登陆使第一次登陆无效

    2、复制一个新的session,拥有新的sessionID

   3、更新SessionRegistry中的ConcurrentMap<Object,Set<String>> principals和Map<String, SessionInformation> sessionIds,这个是在第三个过滤器中ConcurrentSessionFilter需要使用的

Spring Security学习笔记之UsernamePasswordAuthenticationFilter, ConcurrentSessionFilter

UsernamePasswordAuthenticationFilter主要用来处理登录时的验证操作. 它的一般用法请参考Spring Security学习笔记之整体配置 这里主要介绍一下如何用它...
  • py_xin
  • py_xin
  • 2016年09月23日 17:49
  • 5095

UsernamePasswordAuthenticationFilter

UsernamePasswordAuthenticationFilter本身不是过滤器,而是继承了AbstractAuthenticationProcessingFilter才拥有过滤器的性能。 认证...
  • yecong111
  • yecong111
  • 2013年12月01日 23:10
  • 8920

Spring Boot (三)集成spring security

项目GitHub地址 : https://github.com/FrameReserve/TrainingBoot Spring Boot (三)集成spring security,标记地址: h...
  • a286352250
  • a286352250
  • 2016年11月14日 10:46
  • 4665

Spring Security学习笔记之UsernamePasswordAuthenticationFilter, ConcurrentSessionFilter

UsernamePasswordAuthenticationFilter主要用来处理用户登录时的验证操作. 它的一般用法请参考Spring Security学习笔记之整体配置 Concurren...
  • qq_19936739
  • qq_19936739
  • 2017年09月11日 18:30
  • 134

Spring Security3源码分析(7)-UsernamePasswordAuthenticationFilter分析

UsernamePasswordAuthenticationFilter过滤器对应的类路径为  org.springframework.security.web.authentication.Use...
  • u012959829
  • u012959829
  • 2014年09月11日 11:52
  • 1044

UsernamePasswordAuthenticationFilter学习之基础

UsernamePasswordAuthenticationFilter是登陆用户密码验证过滤器,它继承了AbstractAuthenticationProcessingFilter过滤器(真正的Fi...
  • yecong111
  • yecong111
  • 2013年11月28日 23:40
  • 18095

spring security 登录、权限管理配置

登录流程 1)容器启动(MySecurityMetadataSource:loadResourceDefine加载系统资源与权限列表)  2)用户发出请求  3)过滤器拦截(MySecurityF...
  • rongku
  • rongku
  • 2016年04月24日 22:50
  • 10039

UsernamePasswordAuthenticationFilter是登陆用户密码验证过滤器,

UsernamePasswordAuthenticationFilter是登陆用户密码验证过滤器,它继承了AbstractAuthenticationProcessingFilter过滤器(真正的Fi...
  • u014236541
  • u014236541
  • 2015年11月11日 23:08
  • 2084

用户登录:Spring Security3源码分析-UsernamePasswordAuthenticationFilter分析

原文链接:http://dead-knight.iteye.com/blog/1513149 好好 参考链接2:http://blog.csdn.net/yecong111/article/detai...
  • wabiaozia
  • wabiaozia
  • 2017年03月14日 14:01
  • 840

Spring Security 实现身份认证

Spring Security可以运行在不同的身份认证环境中,当我们推荐用户使用Spring Security进行身份认证但并不推荐集成到容器管理的身份认证中时,但当你集成到自己的身份认证系统时,它依...
  • shehun1
  • shehun1
  • 2015年03月30日 16:16
  • 19644
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UsernamePasswordAuthenticationFilter 登录认证
举报原因:
原因补充:

(最多只允许输入30个字)