之前的认证方案
回顾一下之前的认证方案
我们的认证是自定义了一个认证处理器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认证失败处理器接口
思路
实际上在UsernamePasswordAuthenticationFilter进行登录认证的时候
- 如果登录成功了是会调用
AuthenticationSuccessHandler的方法进行认证成功后的处理的。AuthenticationSuccessHandler就是登录成功处理器。 - 如果认证失败了是会调用
AuthenticationFailureHandler的方法进行认证失败后的处理的。AuthenticationFailureHandler就是登录失败处理器。
因此

自定义认证成功处理器
- 实现接口
AuthenticationSuccessHandler - 注入Spring容器
- 撰写方法体
1 |
|
自定义认证失败处理器
- 实现接口
AuthenticationFailureHandler - 注入Spring容器
- 撰写方法体
1 |
|
最后使用配置类进行配置
1 |
|
登出成功处理器【了解一下即可】
自定义登出成功处理器
- 实现接口
AuthenticationFailureHandler - 注入Spring容器
- 撰写方法体
1 |
|
配置
1 | http.logout() |
__END__