jwt自定义认证过滤器

Jwt认证

在许多的项目中,由于做了前后端分离配置,通过jwt生成token,所以需要一个jwt自定义认证过滤器,来实现jwt的token认证;

jwt自定义认证过滤器的作用

JWT自定义认证过滤器的作用是在请求到达后端服务器之前对JWT令牌进行验证和解析,以确保请求的合法性和身份的真实性。

  1. 验证令牌的有效性:通过检查令牌的签名和过期时间等信息,确保令牌是有效且未过期的。
  2. 解析令牌获取用户信息:从令牌中提取用户身份信息,如用户名、角色或权限等,以便后续的身份验证和授权操作。
  3. 进行身份验证:根据令牌中的用户信息,进行用户身份的验证,确保用户是合法的、存在的。
  4. 设置用户上下文:将验证通过的用户信息存放在上下文中,以便在后续的请求处理过程中使用,如获取当前用户信息、进行权限控制等。
  5. 过滤请求:根据请求的URL或其他条件,判断是否需要对请求进行身份验证和授权,以决定是否放行请求或返回相应的错误信息。

JWT自定义认证过滤器的实现步骤:

  1. 创建一个类,命名为JwtAuthenticationFilter,并继承BasicAuthenticationFilter类。
//BasicAuthenticationFilter类是Spring Security框架中的一个过滤器,用于处理基本身份验证。
//它是AbstractAuthenticationProcessingFilter类的子类,用于对请求进行身份验证和授权处理。
  1. 定义一个URL白名单数组,用于存储需要放行的请求地址。
 // 定义一个URL_WHITELIST数组,存储需要放行的请求地址
    private static final String URL_WHITELIST[] = {
   
            "/login",
            "/logout",
            "/captcha",
            "/password",
            "/image/**"
    };
  1. 创建JwtAuthenticationFilter类的构造函数,传入一个AuthenticationManager对象,用于处理身份验证。
// 定义JwtAuthenticationFilter类的构造函数,传入一个AuthenticationManager对象,该对象用于处理身份验证。
    public JwtAuthenticationFilter(AuthenticationManager authenticationManager) {
   
        super(authenticationManager);
    }
  1. 重写doFilterInternal方法,该方法在每个请求中执行身份验证逻辑。
/**
     * 重写doFilterInternal方法,该方法在每个请求中执行,用于身份验证。
     * @param request 请求对象
     * @param response 响应对象
     * @param chain 过滤器链
     * @throws IOException
     * @throws ServletException
     */
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
   
        // 获取请求头中的token
        String token = request.getHeader("token");
        // 打印请求的URL
        System.out.println("请求的url:"+request.getRequestURI());
        // 如果token为空或者请求地址在白名单中,则放行
        if (StringUtil.isEmpty(token) || new ArrayList<String>(Arrays.asList(URL_WHITELIST)).contains(request.getRequestURI())){
   
            chain.doFilter(request,response);//放行
            return;
        }
        // 验证token是否有效
        CheckResult checkResult = JwtUtils.validateJWT(token);//validateJWT时是自定义的验证JWT工具类
        if (!checkResult.isSuccess()){
   //如果验证结果不为空
            switch (checkResult.getErrCode()){
   
                // 如果token不存在
                case JwtConstant.JWT_ERRCODE_NULL: throw new JwtException("token不存在!");
                    // 如果token过期
                case JwtConstant.JWT_ERRCODE_EXPIRE: throw new JwtException("Token过期");
                    // 如果验证不通过
                case JwtConstant.JWT_ERRCODE_FAIL: throw new JwtException("Token验证不通过");
            }
        }
        // 验证通过,解析token获取用户名
        Claims claims = JwtUtils.parseJWT(token);
        String username = claims.getSubject();
        // 根据用户名获取用户信息
        SysUser sysUser = sysUserService.getByUserName(username);
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值