SpringBoot集成JWT(极简版)

SpringBoot集成JWT(极简版)

在WebConfig配置类中设置接口统一前缀

import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements  WebMvcConfigurer {
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        // 指定controller统一的接口前缀
        configurer.addPathPrefix("/api", clazz -> clazz.isAnnotationPresent(RestController.class));
    }
}

导入JWT依赖

<dependency>
    <groupid>com.auth0</groupid>
    <artifactid>java-jwt</artifactid>
    <version>3.10.3</version>
</dependency>

JWT工具类TokenUtils.java(生成token的工具类)

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.bai.entity.Admin;
import com.bai.service.AdminService;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;

@Component
@Slf4j
public class TokenUtils {

    private static AdminService staticAdminService;

    @Resource
    private AdminService adminService;

    @PostConstruct
    public void setUserService() {
        staticAdminService = adminService;
    }

    /**
     * &#x751F;&#x6210;token
     *
     * @return
     */
    public static String genToken(String adminId, String sign) {
        return JWT.create().withAudience(adminId) // &#x5C06; user id &#x4FDD;&#x5B58;&#x5230; token &#x91CC;&#x9762;,&#x4F5C;&#x4E3A;&#x8F7D;&#x8377;
                .withExpiresAt(DateUtil.offsetHour(new Date(), 2)) // 2&#x5C0F;&#x65F6;&#x540E;token&#x8FC7;&#x671F;
                .sign(Algorithm.HMAC256(sign)); // &#x4EE5; password &#x4F5C;&#x4E3A; token &#x7684;&#x5BC6;&#x94A5;
    }

    /**
     * &#x83B7;&#x53D6;&#x5F53;&#x524D;&#x767B;&#x5F55;&#x7684;&#x7528;&#x6237;&#x4FE1;&#x606F;
     *
     * @return user&#x5BF9;&#x8C61;
     *  /admin?token=xxxx
     */
    public static Admin getCurrentAdmin() {
        String token = null;
        try {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            token = request.getHeader("token");
            if (StrUtil.isNotBlank(token)) {
                token = request.getParameter("token");
            }
            if (StrUtil.isBlank(token)) {
                log.error("&#x83B7;&#x53D6;&#x5F53;&#x524D;&#x767B;&#x5F55;&#x7684;token&#x5931;&#x8D25;&#xFF0C; token: {}", token);
                return null;
            }
            String adminId = JWT.decode(token).getAudience().get(0);
            return staticAdminService.getById(Integer.valueOf(adminId));
        } catch (Exception e) {
            log.error("&#x83B7;&#x53D6;&#x5F53;&#x524D;&#x767B;&#x5F55;&#x7684;&#x7BA1;&#x7406;&#x5458;&#x4FE1;&#x606F;&#x5931;&#x8D25;, token={}", token,  e);
            return null;
        }
    }
}

拦截器JwtInterceptor.java


import cn.hutool.core.util.StrUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.bai.entity.Admin;
import com.bai.exception.ServiceException;
import com.bai.service.AdminService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@Component
@Slf4j
public class LoginJWTInterceptor implements HandlerInterceptor {

    private static final String ERROR_CODE_401 = "401";

    @Autowired
    private AdminService adminService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {

        //&#x8FD9;&#x91CC;&#x662F;&#x5224;&#x65AD;&#x6D4F;&#x89C8;&#x5668;&#x8BF7;&#x6C42;&#x5934;&#x91CC;&#x7684;token
        String token = request.getHeader("token");

        if (StrUtil.isBlank(token)) {
            token = request.getParameter("token");
        }

        // &#x6267;&#x884C;&#x8BA4;&#x8BC1;
        if (StrUtil.isBlank(token)) {
            throw new ServiceException(ERROR_CODE_401, "&#x65E0;token&#xFF0C;&#x8BF7;&#x91CD;&#x65B0;&#x767B;&#x5F55;");
        }
        // &#x83B7;&#x53D6; token &#x4E2D;&#x7684;adminId
        String adminId;
        Admin admin;
        try {
            adminId = JWT.decode(token).getAudience().get(0);
            // &#x6839;&#x636E;token&#x4E2D;&#x7684;userid&#x67E5;&#x8BE2;&#x6570;&#x636E;&#x5E93;
            admin = adminService.getById(Integer.parseInt(adminId));
        } catch (Exception e) {
            String errMsg = "token&#x9A8C;&#x8BC1;&#x5931;&#x8D25;&#xFF0C;&#x8BF7;&#x91CD;&#x65B0;&#x767B;&#x5F55;";
            log.error(errMsg + ", token=" + token, e);
            throw new ServiceException(ERROR_CODE_401, errMsg);
        }
        if (admin == null) {
            throw new ServiceException(ERROR_CODE_401, "&#x7528;&#x6237;&#x4E0D;&#x5B58;&#x5728;&#xFF0C;&#x8BF7;&#x91CD;&#x65B0;&#x767B;&#x5F55;");
        }

        try {
            // &#x7528;&#x6237;&#x5BC6;&#x7801;&#x52A0;&#x7B7E;&#x9A8C;&#x8BC1; token
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(admin.getPassword())).build();
            jwtVerifier.verify(token); // &#x9A8C;&#x8BC1;token
        } catch (JWTVerificationException e) {
            throw new ServiceException(ERROR_CODE_401, "token&#x9A8C;&#x8BC1;&#x5931;&#x8D25;&#xFF0C;&#x8BF7;&#x91CD;&#x65B0;&#x767B;&#x5F55;");
        }
        return true;
    }
}

在WebConfig配置类中添加自定义拦截器


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoginJWTInterceptor loginJWTInterceptor;

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        // &#x6307;&#x5B9A;controller&#x7EDF;&#x4E00;&#x7684;&#x63A5;&#x53E3;&#x524D;&#x7F00;
        configurer.addPathPrefix("/api", clazz -> clazz.isAnnotationPresent(RestController.class));
    }

    // &#x52A0;&#x81EA;&#x5B9A;&#x4E49;&#x62E6;&#x622A;&#x5668;JwtInterceptor&#xFF0C;&#x8BBE;&#x7F6E;&#x62E6;&#x622A;&#x89C4;&#x5219;
    //.excludePathPatterns("/api/admin/login");&#x653E;&#x5F00;&#x767B;&#x5F55;&#x63A5;&#x53E3;&#xFF0C;&#x56E0;&#x4E3A;&#x767B;&#x5F55;&#x7684;&#x65F6;&#x5019;&#x8FD8;&#x6CA1;&#x6709;token
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginJWTInterceptor)  // &#x6DFB;&#x52A0;&#x6240;&#x6709;&#x8DEF;&#x5F84;&#x9700;&#x8981;&#x6821;&#x9A8C;
                .addPathPatterns("/api/**").excludePathPatterns("/api/admin/login", "/api/admin/register");//&#x4E0D;&#x9700;&#x8981;&#x62E6;&#x622A;&#x7684;&#x63A5;&#x53E3;
    }

}

设置自定义头配置(前端在request拦截器设置自定义头)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CrosConfiguration {

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*"); // 1 &#x8BBE;&#x7F6E;&#x8BBF;&#x95EE;&#x6E90;&#x5730;&#x5740;
        corsConfiguration.addAllowedHeader("*"); // 2 &#x8BBE;&#x7F6E;&#x8BBF;&#x95EE;&#x6E90;&#x8BF7;&#x6C42;&#x5934;
        corsConfiguration.addAllowedMethod("*"); // 3 &#x8BBE;&#x7F6E;&#x8BBF;&#x95EE;&#x6E90;&#x8BF7;&#x6C42;&#x65B9;&#x6CD5;
        source.registerCorsConfiguration("/**", corsConfiguration); // 4 &#x5BF9;&#x63A5;&#x53E3;&#x914D;&#x7F6E;&#x8DE8;&#x57DF;&#x8BBE;&#x7F6E;
        return new CorsFilter(source);
    }
}

Original: https://www.cnblogs.com/b10100912/p/16895982.html
Author: 面向CV工程师
Title: SpringBoot集成JWT(极简版)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/684913/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球