根据以上的步骤,用户登录成功之后,已经拿到了对应的token。那么之后用户就可以拿这个token到各个服务器了,但是各个服务器是如何判断验证是哪个用户的么?也就是各个服务器是如何验证这个token的。
重写验证的过滤器
之前的springsecurity框架自己验证的时候,是有一个过滤器BasicAuthenticationFilter 既然现在我们认证的代码已经重写了,所以验证的也要重写
自己写一个过滤器,继承BasicAuthenticationFilter,重写里面的验证的方法doFilterInternal()
代码语言:javascript复制public class JwtVerifyFilter extends BasicAuthenticationFilter {
将token生成的配置引入
private RsaKeyProperties prop;
public JwtVerifyFilter(AuthenticationManager authenticationManager, RsaKeyProperties prop) {
super(authenticationManager);
this.prop = prop;
}
public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
获取到token的头
String header = request.getHeader("Authorization");
if (header == null || !header.startsWith("Bearer ")) {
没有登录走的
//如果携带错误的token,则给用户提示请登录!
继续走后面的过滤器链
chain.doFilter(request, response);
response.setContentType("application/json;charset=utf-8");
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
PrintWriter out = response.getWriter();
Map resultMap = new HashMap();
resultMap.put("code", HttpServletResponse.SC_FORBIDDEN);
resultMap.put("msg", "请登录!");
out.write(new ObjectMapper().writeValueAsString(resultMap));
out.flush();
out.close();
} else {
有token走的流程
//如果携带了正确格式的token要先得到token
String token = header.replace("Bearer ", "");
//验证tken是否正确,用公钥进行验证,payload就是载荷部分
Payload<SysUser> payload = JwtUtils.getInfoFromToken(token, prop.getPublicKey(), SysUser.class);
得到用户的信息,这个用户的信息已经封装
SysUser user = payload.getUserInfo();
if(user!=null){
封装为框架人家要的对象
UsernamePasswordAuthenticationToken authResult = new UsernamePasswordAuthenticationToken(user.getUsername(), null, user.getAuthorities());
将用户的信息放在session中
SecurityContextHolder.getContext().setAuthentication(authResult);
chain.doFilter(request, response);
}
}
}
}
以上就是重写的验证的过滤器