springboot整合springsecurity框架,重写验证的过滤器(分布式项目)(六)

1 各个服务器是如何验证这个token的?

根据以上的步骤,用户登录成功之后,已经拿到了对应的token。那么之后用户就可以拿这个token到各个服务器了,但是各个服务器是如何判断验证是哪个用户的么?也就是各个服务器是如何验证这个token的。

2 重写验证的过滤器

之前的springsecurity框架自己验证的时候,是有一个过滤器BasicAuthenticationFilter
既然现在我们认证的代码已经重写了,所以验证的也要重写

自己写一个过滤器,继承BasicAuthenticationFilter,重写里面的验证的方法doFilterInternal()

在这里插入图片描述

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);
            }
        }
    }




}

以上就是重写的验证的过滤器

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一写代码就开心

你的打赏将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值