基于Spring Security实现自定义认证-以短信登录为例
《Spring Security实战》、慕课网《Spring Security技术栈开发企业级认证与授权》笔记
实现基于Spring Security的认证有两种方式
- 增加一个过滤器继承OncePerRequestFilter,将这个Filter放到HttpSecurity的合适的位置。(继承OncePerRequestFilter的目的是确保一次请求只通过一次该过滤器)
- 基于Spring Security的自定义认证
方法1的那种过滤器的方式大家应该很熟悉,就不展开记录了,下面详细说一下基于Spring Security的自定义认证。
先以UsernamePassword认证为例,先捋一下认证流程。
基本概念
- Authentication:Spring Security验证的封装类,包括权限、确定身份正确的凭据、身份详细信息、是否被验证。常见的实现类有
RememberMeAuthenticationToken
、UsernamePasswordAuthenticationToken
- AuthenticationProvider:Spring Security的一个验证过程,一次完整的认证可以包含多个AuthenticationProvider,一般由ProviderManager管理。Authentication在AuthenticationProvider中流动。用大白话说就是不同的AuthenticationProvider提供不同的token。
- AuthenticationManager:处理Authentication的请求,整个系统只有一个。ProviderManager是AuthenticationManager的实现类
UsernamePassword认证流程
- 进入
UsernamePasswordAuthenticationFilter
类:attemptAuthentication()
方法中将前端传过来的username
、password
封装到UsernamePasswordAuthenticationToken
中并标记为未认证。最后调用this.getAuthenticationManager().authenticate(authRequest)
交给AuthenticationManager处理。 - ProviderManager根据传入的token类从众多的AuthenticationProvider中找出合适的AuthenticationProvider来处理改认证。
- 在具体的XXXAuthenticationProvider中认证用户返回带有认证通过和详细信息的token。
所以我们基于Spring Security自定义一个认证要新建一个XXXAuthenticationToken和XXXAuthenticationProvider,最后将自己的逻辑加入到HttpSecurity的过滤器链中。
下边以短信登录为例实践上边的知识点。
短信登录逻辑:
- 前端输入手机号,然后获取短信验证码,最后带着手机号和验证码一起登录
- 服务端要监听这个登录地址,校验验证码是否正确
- 正确使用Spring Security自定义认证颁发一个token给前端。
下面贴代码:
SmsValidateCodeFilter
短信验证码过滤器,验证短信登录验证码是否正确
1 | java复制代码package com.zchi.customizeAuthentication.security.smsCode; |
SmsCodeAuthenticationToken
直接照着UsernamePasswordAuthenticationToken写就行
1 | java复制代码package com.zchi.customizeAuthentication.security.smsCode; |
SmsCodeAuthenticationProvider
Authentication的提供者,根据之前SmsCodeAuthenticationFilter中存入token中的信息获取当前用户信息。声明支持的token类型
1 | java复制代码package com.zchi.customizeAuthentication.security.smsCode; |
SmsCodeAuthenticationSecurityConfig
将自己写的这些类配置到过滤器链上
1 | java复制代码package com.zchi.customizeAuthentication.security.smsCode; |
SecurityConfig
项目的安全配置类
1 | java复制代码package com.zchi.customizeAuthentication.security; |
参考:
《Spring Security实战》
《Spring Security技术栈开发企业级认证与授权》
代码连接securityDemo: 《基于Spring Security实现自定义认证-以短信登录为例》代码 (gitee.com)
本文转载自: 掘金