使用jwt自定义spring security的认证过程
前言
这部分好像已经不用自己写了,有框架已经实现了,不过是为了学习就自己写一遍吧提示:以下是本篇文章正文内容,下面案例可供参考
创建UsernamePasswordAuthenticationFilter的子类
代码如下(示例):
public class JwtLoginFilter extends UsernamePasswordAuthenticationFilter {
@Override
public Authentication attemptAuthentication(HttpServletRequestrequest,HttpServletResponse response)
throws AuthenticationException {
UsernamePasswordAuthenticationToken authentication = null;
String username = "";
String password = "";
try {
//分析请求参数
UserVo userVo = JSONUtil.getGson().fromJson(request.getReader(), UserVo.class);
username = userVo.getUsername();
password = userVo.getPassword();
}catch (IOException e){
//该方法不允许抛出IOIoException
//把IoException封装成AuthenticationException的子类
throw new InternalAuthenticationServiceException(
e.getMessage(), e.getCause());
}
if (username == null) {
username = "";
}
if (password == null) {
password = "";
}
username = username.trim();
authentication = new UsernamePasswordAuthenticationToken(username, password);
//设置放入认证的authentication
super.setDetails(request, authentication);
//调用AuthenticationManager进行认证
return super.getAuthenticationManager().authenticate(authentication);
}
}
基本是照抄UsernamePasswordAuthenticationFilter中的流程,唯一的区别就是就获取参数的方式是使用json获取
失败或成功时的处理
有两种方式,可以复写AbstractAuthenticationProcessingFilter(这是UsernamePasswordAuthenticationFilter的父类)中的对应方法,也可以提供AuthenticationSuccessHandler和AuthenticationFailureHandler的实现类,区别在于后一种方法无需自己清理SecurityContextHolder和记录日志(记的日志是英文的),我的实现是第二种
@Component
public class LoginSuccessConfig implements AuthenticationSuccessHandler