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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 4G演进之路:FDD还是TDD?[通俗易懂]

    4G演进之路:FDD还是TDD?[通俗易懂]达到更高频谱利用率、覆盖率,同时保证多媒体应用的QoS服务质量,已经成为第四代蜂窝4G网络的挑战和目标。在4G系统里,有许多关于物理层和多接入以提高频谱利用率方面的研究,以支持高达100Mbps甚至更高的数据传输速率。例如,正交频分多址OFDMA、MIMO天线,以及跨层资源优化,被认为是4G系统中的核心技术,并同时在频率选择的衰落信道中提供高可靠通信。  另一方面,4G系统双工方式的选择,是F

  • SSL协议概述和握手过程

    SSL协议概述和握手过程SSL协议主要是为了保证WEB通信的安全性,是基于TCP协议的SSL协议有三个特性:1.机密性SSL协议的机密性主要依靠的是对称加密体质,在通信过程中,使用对称密码进行加密解密保证信息的安全性。2.完整性SSL协议的完整性主要依靠的是散列技术,对分组数据进行压缩之后,利用散列函数获得哈希值,加在分组信息的尾部,并且利用对称密码进行加密之后再传输(在传输到TCP层之前还有一个动作

  • Android开发之AOP编程

    Android开发之AOP编程

  • Django(3)pycharm创建项目[通俗易懂]

    Django(3)pycharm创建项目[通俗易懂]创建项目我们创建django项目有两种方式,命令行方式和使用pycharm工具创建,本文就介绍常用的pycharm工具创建首先点击django,输入项目的名称,选择创建好的虚拟环境,最后点击cre

  • python可以自动回收垃圾吗_python多线程实现

    python可以自动回收垃圾吗_python多线程实现前言现在的高级语言如java,c#等,都采用了垃圾回收机制,而不再像c,c++里,需要用户自己管理内存。自己管理内存及其自由,可以任意申请内存,但这如同一把双刃剑,可能会造成内存泄漏,空指针等bug

  • 继电器驱动电路使用笔记「建议收藏」

    继电器驱动电路使用笔记「建议收藏」在参加立创开源社区的暑假d物联网比赛中需要使用mcu控制继电器,我采用的是技新课堂的继电器电路,但是翻车了最后使用里零妖的继电器驱动方案。零妖阿里云插座文档:https://www.yuque.com/lingyao/oshwhub/fp69nm立创暑期训练营文档:https://www.yuque.com/iiyqfa/ssdag4/pwdyeo智能插座的开源工程(包含继电器部分):https://oshwhub.com/7a745fc8/ke-shang-yong-wu-lian-wang-kai

发表回复

您的电子邮箱地址不会被公开。

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