SpringBoot——JWT实现登录校验[通俗易懂]

SpringBoot——JWT实现登录校验[通俗易懂]SpringBoot——JWT实现登录校验

大家好,又见面了,我是你们的朋友全栈君。

实现的效果是,在的客户端登录时会返回一个token用作客户端后续登录校验,登录之后客户端需要将token放在请求的head中,否则返回的登录失败。话不多说直接上代码。

1.JWT工具类

前面的文章有JWT的一个简单的示例,后来我对它进行了完善,代码如下:

 package com.youyou.shiro.jwt;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.youyou.util.utils.DateUtil;
import org.apache.commons.lang3.StringUtils;

import java.util.Date;

/**
 * @author youyou
 * <br/>date 2019-01-09
 */
public class JwtUtil {

    private static final String USERNAME = "username";

    private static final String KEY = "123456qwe";

    /**
     * 过期时间(分钟)
     */
    private static final int EXPIRATION_TIME = 5;

    /**
     * 生成token
     *
     * @param userName
     * @return
     * @author 刘朋
     * <br/>date 2019-01-09
     */
    public static String createToken(String userName) {
        Algorithm algorithm = Algorithm.HMAC256(KEY);

        Date expirationDate = DateUtil.addMinutes(DateUtil.getNow(), EXPIRATION_TIME);
        //生成token
        return JWT.create().withClaim(USERNAME, userName)
                .withExpiresAt(expirationDate)
                .sign(algorithm);
    }

    /**
     * 获取用户名
     *
     * @param token
     * @return
     * @author 刘朋
     * <br/>date 2019-03-08
     */
    public static String getUsername(String token) {
        return getValueByToken(token, USERNAME);
    }

    /**
     * 获取token中的值
     *
     * @param token
     * @param key
     * @return
     */
    public static String getValueByToken(String token, String key) {
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(KEY)).build();
        DecodedJWT decode = verifier.verify(token);
        return decode.getClaim(key).asString();
    }

    /**
     * 校验是否过期,过期返回true
     * @param token
     * @return
     * @author 刘朋
     * <br/>date 2019-03-12
     */
    public static boolean isExpires(String token){
        if(StringUtils.isBlank(token)){
            return true;
        }
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(KEY)).build();
        try {
            verifier.verify(token);
        }catch (JWTVerificationException e){
            return true;
        }
        return false;
    }

   

}

2.登录Controller

这里博主用的是MyBatisPlus,做的orm框架,有兴趣的话可以看一下前面的博文https://blog.csdn.net/lp840312696/article/details/83691915

 package com.youyou.login.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.youyou.common.http.ResponseMessage;
import com.youyou.common.http.Result;
import com.youyou.login.entity.UserDO;
import com.youyou.login.service.LoginService;
import com.youyou.shiro.jwt.JwtUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Objects;

/**
 * 登录接口
 *
 * @author 刘朋
 * <br/>date 2019-03-12
 */
@Api(description = "登录接口")
@RestController
@RequestMapping("/login")
public class LoginController {

    @Autowired
    private LoginService service;


    @ApiOperation(value = "登录")
    @PostMapping("")
    public ResponseMessage<String> login(String username, String password) {

        if(StringUtils.isAnyBlank(username , password)){
            return Result.error("用户名密码不能为空!");
        }

        QueryWrapper<UserDO> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name" ,username);
        queryWrapper.eq("password" ,password);

        UserDO userDO = service.querySingle(queryWrapper);
        if(Objects.isNull(userDO)){
            return Result.error("用户名密码错误!");
        }

        //生成一个token
        String token = JwtUtil.createToken(username);



        return Result.success(token);
    }

}

3.创建过滤器

 package com.youyou.login.config;

import com.youyou.login.filter.LoginFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 登录拦截配置
 *
 * @author 刘朋
 * <br/>date 2019-03-21
 */

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean loginFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new LoginFilter());
        registration.addUrlPatterns("/api/*");
        registration.setName("LoginFilter");
        //数越小越先执行
        registration.setOrder(6);
        return registration;
    }

}

经过三步配置就已经完成了登录检验了,需要登录之后才能访问的接口需要以api开头。

4.配置swagger(这步不重要,如果没有用到swagger的话可以忽略)

如果大家用到了swagger的话一定会有这个问题,使用swagger测试的时候也需要传token进行登录校验,所以需要以下配置

 package com.youyou.config;

import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket swaggerSpringMvcPlugin() {

        return initDocket();
        //简单的swagger配置
//        return new Docket(DocumentationType.SWAGGER_2).select()
//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)).build();
    }

    /**
     * 在swagger界面中每个接口添加个Authorization参数的录入框,用来做的登录校验
     * @param
     * @return
     * @author 刘朋
     * <br/>date 2019-03-25
     */
    public static Docket initDocket() {
        ParameterBuilder parameterBuilder = new ParameterBuilder();
        List<Parameter> parameters = new ArrayList<>();
        parameterBuilder.name("Authorization").description("token").modelRef(new ModelRef("string"))
                .parameterType("header").required(false).build();
        parameters.add(parameterBuilder.build());

        return new Docket(DocumentationType.SWAGGER_2).select()
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)).build()
                .globalOperationParameters(parameters);
    }

}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106453.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 单片机_MFRC522射频模块使用方法(含代码)

    单片机_MFRC522射频模块使用方法(含代码)MFRC522射频模块使用方法本文只讲解MFRC522射频模块使用方法(下文简称522模块),不包含原理说明,原理下篇~一、管脚解释522模块总共有8个引脚,除去复位、GND接地、3.3V电源、NC端悬空、SCK时钟端,剩余3个引脚,起数据作用。二、连接方法这里主要使用IIC的方法,相信写过IIC的同学都很熟悉这段代码。不熟悉也没关系,后文会附上52单片机的LCD1602显示UID的实现代码,包含UART测试代码。显而易见,通过总线办法读取数据只需要依照手册写代码就可以读出来,这里官方提供了

    2022年7月26日
    45
  • 一步一步画战车(雷电3接口)

    在用EXCEL做量化分析的时候,经常需要通过一些金融数据平台的API接口,获取各种数据。最常用的公共API接口有YahooFinance,GoogleFinance,新浪财经,搜狐财经等。这些都不需要注册,就可以直接使用。获取方式相对简单,但数据种类不够丰富,通常只包括交易数据和财务数据。另外一些免费的金融数据平台,如国外的Quandl和国内的Tushare也都提供了API接口,数据种类更…

    2022年4月10日
    121
  • 手把手教你 | 识别色环电阻/贴片电阻阻值「建议收藏」

    手把手教你 | 识别色环电阻/贴片电阻阻值「建议收藏」电阻元件的电阻值大小一般与温度,材料,长度,还有横截面积有关,通常贴片电阻电阻表面都标识数字,色环电阻多采用色标法标记阻值。本期视频就跟安迪一起学习如何计算电阻阻值吧~手把手教你|识别色环电阻/贴片电阻阻值…

    2022年8月21日
    7
  • 在毕设中学习01——python、正态和标准正态分布、matlab数据文件导出

    在毕设中学习01——python、正态和标准正态分布、matlab数据文件导出在毕设中学习——卷积、python(0521)2022.5.21文章目录在毕设中学习——卷积、python(0521)正态分布标准正态分布matplotlib.pyplot画图Python中读取.m文件np.random.normal()正态分布numpy.random.normal(loc=0,scale=1e-2,size=shape)意义如下:参数loc(float):正态分布的均值,对应着这个分布的中心。loc=0说明这一个以Y轴为对称轴的正态分布,参数scale(float):

    2022年8月11日
    6
  • nohup命令详解[通俗易懂]

    nohup命令详解[通俗易懂]nohup命令详解

    2022年4月24日
    41
  • linux find命令详解_mount命令详解

    linux find命令详解_mount命令详解find命令格式:findpath-option[-print][-exec-okcommand]{}\;find命令的参数:path:要查找的目录路径。~表示$HO

    2022年7月28日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号