Spring Security 登录密码验证过程(UsernamePasswordAuthenticationFilter)

Spring-Security主要是一个由一堆Filter组成的过滤器链,每个Filter做自己的事情。今天我跟一下登录的密码认证过程,主要是UsernamePasswordAuthenticationFilter这个类

1.web.xml中配置security

    
		springSecurityFilterChain
		org.springframework.web.filter.DelegatingFilterProxy
	
	
		springSecurityFilterChain
		/*
	

 

2. spring-security.xml  这里定义了一个ValidateCodeAuthenticationFilter,这个filter继承自   UsernamePasswordAuthenticationFilter,在做认证的时候调用UsernamePasswordAuthenticationFilter中的attemptAuthentication方法,

  
   
   
   
   
   
   
   

Spring Security 登录密码验证过程(UsernamePasswordAuthenticationFilter)_第1张图片

 

3.

 UsernamePasswordAuthenticationFilter中的attemptAuthentication方法将信息赋值给UsernamePasswordAuthenticationToken(authRequest),然后调用getAuthenticationManager().authenticate(authRequest)对用户密码的正确性进行验证,认证失败就抛出异常,成功就返回Authentication对象。

Spring Security 登录密码验证过程(UsernamePasswordAuthenticationFilter)_第2张图片4.authenticate()方法的实现在ProviderManager类中,红框部分

result = provider.authenticate(authentication);

在AbstractUserDetailsAuthenticationProvider类中

Spring Security 登录密码验证过程(UsernamePasswordAuthenticationFilter)_第3张图片

 

 

Spring Security 登录密码验证过程(UsernamePasswordAuthenticationFilter)_第4张图片 5.上图方法断点进入DaoAuthenticationProvider类

Spring Security 登录密码验证过程(UsernamePasswordAuthenticationFilter)_第5张图片

注意这里的loadUserByUsername()方法需要自定义类实现UserDetailsService接口并重写loadUserByUsername()方法

6.拿到user之后再做一些其他属性的验证,如用户是否锁住,是否删除等,和密码验证其中密码的验证加了盐,具体的验证过程在红框里。

Spring Security 登录密码验证过程(UsernamePasswordAuthenticationFilter)_第6张图片

你可能感兴趣的:(javaweb)