实现功能:
- 使用spring security实现一个邮件验证码登录。
1.学习如何配置
想要对security进行自定义配置,要先继承WebSecurityConfigurerAdapter然后重写configure()方法。
这里注意一点要确认配置了@EnableWebSecurity,这样才能使配置生效。
准备工作做好后,让我们看如何自定义配置。
对于HttpSecurity的配置
1 |
|
2.默认鉴权流程
对于Spring Security默认鉴权的流程:
-
进入UsernamePasswordAuthenticationFilter执行attemptAuthentication()方法
- 在attemptAuthentication()方法中,先实例化未认证通过的UsernamePasswordToken对象
- 在attemptAuthentication()方法中,调用getAuthenticationManager()获取一个Manager,这里获取的是ProviderManager。
-
进入ProviderManager执行authenticate()方法
- 在该方法里会找到一个适合的provider去处理传进来的UsernamePasswordAuthenticationToken,这里使用的是DaoAuthenticationProvider。
- 执行DaoAuthenticationProvider的authenticate()方法,在这里会进行校验用户名,密码是否正确,正确就调用UsernamePasswordAuthenticationToken的另一个构造函数(带有权限信息),并将是否认证设置为true。
-
至此,UsernamePasswordAuthenticationFilter执行结束。
结合下图理解:
1.UsernamePasswordAuthenticationFIlter
在这个类中,我们要看的是下面这部分:
1 |
|
UsernamePasswordAuthenticationToken
在这个类中,最主要的是两个构造方法以及一个eraseCredentials()方法。
1 |
|
在UsernamePasswordAuthenticationFilter#attemptAuthentication()方法里最后返回this.getAuthenticationManager().authenticate(authRequest),这里对我们返回的UsernamePasswordAuthenticationToken进行认证,那我们看看AuthenticationManager。
AuthenticationManager是一个接口,而这个UsernamePasswordAuthenticationFilter调用的是ProviderManager这个类。这里为了便于研究把异常和日志部分给去掉了。
1 |
|