之前的认证方案
回顾一下之前的认证方案
我们的认证是自定义了一个认证处理器JwtAuthenticationTokenFilter
,并把他加在了UsernamePasswordAuthenticationFilter
过滤器的前面。在过滤器链中我们去掉了UsernamePasswordAuthenticationFilter
登录认证的过程是:
先经过
JwtAuthenticationTokenFilter
,查看token。token为null放行。
然后进入登录接口
/user/login
,然后调用了Service层的LoginService
。在
LoginServiceImpl
里,实现了认证过程。调用
authenticationManager.authenticate()
方法进行认证。- 认证成功【
UsernamePasswordAuthenticationToken!=null
】
UsernamePasswordAuthenticationToken
中获取UserDetails
的实现类LoginUser
。- 从
Loginuser
中获取UserId
。 - 使用
Jwt
工具类加密userId
生成token
。 - 将
Loginuser
存储到redis
中。 - 将
token
封装成响应体返回给前端。
- 认证失败【
UsernamePasswordAuthenticationToken==null
】
抛出异常。
throw new RuntimeException("用户名或密码错误");
- 认证成功【
注意:我们没有使用UsernamePasswordAuthenticationFilter
另一种认证方案
前置知识
我们将认证成功处理的内容 和 认证失败处理的内容都放在了LoginServiceImpl
。
而实际上UsernamePasswordAuthenticationFilter
过滤器,里面自带了认证成功处理器和认证失败处理器。
1 | public class UsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter{...} |
UsernamePasswordAuthenticationFilter
继承了一个抽象的父类AbstractAuthenticationProcessingFilter
。
我们来看一看其中的doFilter
方法。
1 | public abstract class AbstractAuthenticationProcessingFilter extends GenericFilterBean implements ApplicationEventPublisherAware, MessageSourceAware { |
private AuthenticationSuccessHandler successHandler
认证成功处理器接口private AuthenticationFailureHandler failureHandler
认证失败处理器接口
思路
实际上在UsernamePasswordAuthenticationFilte
r进行登录认证的时候
- 如果登录成功了是会调用
AuthenticationSuccessHandle
r的方法进行认证成功后的处理的。AuthenticationSuccessHandler
就是登录成功处理器。 - 如果认证失败了是会调用
AuthenticationFailureHandler
的方法进行认证失败后的处理的。AuthenticationFailureHandler
就是登录失败处理器。
因此
自定义认证成功处理器
- 实现接口
AuthenticationSuccessHandler
- 注入Spring容器
- 撰写方法体
1 |
|
自定义认证失败处理器
- 实现接口
AuthenticationFailureHandler
- 注入Spring容器
- 撰写方法体
1 |
|
最后使用配置类进行配置
1 |
|
登出成功处理器【了解一下即可】
自定义登出成功处理器
- 实现接口
AuthenticationFailureHandler
- 注入Spring容器
- 撰写方法体
1 |
|
配置
1 | http.logout() |
__END__