Java实现基于token认证

这篇具有很好参考价值的文章主要介绍了Java实现基于token认证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Jwt全称是:json web token,以JSON对象的形式安全的传递信息。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。

用户登录返回token进行验证的流程:

  1. 用户使用账号发出post请求;
  2. 服务器使用私钥创建一个token;
  3. 服务器返回这个token给浏览器;
  4. 浏览器将该token串在请求头中像服务器发送请求;
  5. 服务器验证该token;
  6. 返回响应的资源给浏览器。

优点
1.简洁: 可以通过URL、POST参数或者在HTTP header发送,因为数据量小,传输速度也很快;
2.自包含:负载中可以包含用户所需要的信息,避免了多次查询数据库;
3.因为Token是以JSON加密的形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持;
4.不需要在服务端保存会话信息,特别适用于分布式微服务(在符合规范时间内,服务器重启也可以继续使用)。
缺点
1.无法作废已颁布的令牌;
2.不易应对数据过期

简单介绍完看看:

Spring Boot和Jwt集成:
1.pom.xml依赖

    <dependency>
        <groupId>com.auth0</groupId>
        <artifactId>java-jwt</artifactId>
        <version>3.10.3</version>
    </dependency>

2.Token生成工具类

package com.cyb.springboot.utils;

import cn.hutool.core.date.DateUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;

import java.util.Date;

/**

  • @author 车矣捕

  • @version 1.0

  • @description: 生成token

  • @date 2022/4/22 8:51
    */
    public class TokenUtils {

    /**

    • @description: 生成token
    • @author 车矣捕
    • @date: 2022/4/22
      */
      public static String getToken(String userId,String sign){
      return JWT.create().withAudience(userId) // 将 user id 保存到 token 里面 作为载荷
      .withExpiresAt(DateUtil.offsetHour(new Date(),2)) //两小时后token过期
      .sign(Algorithm.HMAC256(sign)); // 以 sign 作为 token 的密钥

    }
    }
    3.登录请求生成并返回token

@Override
public UserDTO login(UserDTO userDTO) {
User one = getUserInfo(userDTO);
if (one!=null){
BeanUtil.copyProperties(one,userDTO,true);

        //设置token
        String token = TokenUtils.getToken(one.getId().toString(), one.getPassword());
        userDTO.setToken(token);


        return userDTO;
    } else {
        throw new ServiceException(Constants.CODE_600,"用户名或密码错误");
    }
}

4.前端请求返回token
Java实现基于token认证
Java实现基于token认证
5.vue加入请求守卫(发送请求是token带上)

request.interceptors.request.use(config => {

let user = localStorage.getItem("user") ? JSON.parse(localStorage.getItem("user")) : null
if (user) {
    config.headers['token'] = user.token;  // 设置请求头
}
return config

});

6.发送请求带随token

Java实现基于token认证

7.创建 JwtInterceptor 实现拦截器 重写 preHandle 方法

public class JwtInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    String token = request.getHeader("token");
    // 如果不是映射到方法直接通过
    if(!(handler instanceof HandlerMethod)) {
        return true;
    }
    // 执行认证
    if (StrUtil.isBlank(token)) {
        throw new ServiceException(Constants.CODE_401,"无token,请重新登录");
    }
    // 获取 token 中的 user id
    String userId;
    try {
        userId = JWT.decode(token).getAudience().get(0);
    } catch (JWTDecodeException j) {
        throw new ServiceException(Constants.CODE_401,"token验证失败,请重新登录");
    }
    //根据token中的userid查询数据库*3. N/*
    User user = userService.getById(userId);
    if (user == null) {
        throw new ServiceException(Constants.CODE_401,"用户不存在,请重新登录");
    }
    // 用户密码加签验证 token
    JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build();
    try {
        jwtVerifier.verify(token); //验证 token
    } catch (JWTVerificationException e) {
        throw new ServiceException(Constants.CODE_401,"token验证失败,请重新登录");
    }
    return true;
}

}
8.创建 InterceptorConfig 实现 WebMvcConfigurer,放行指定请求

/**

  • @author 车矣捕

  • @version 1.0

  • @description: 指定放行

  • @date 2022/4/22 9:54
    */
    @Configuration
    public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(jwtInterceptor())
    .addPathPatterns(“/user”) // 拦截所有请求,通过判断 token是否合法 决定是否需要登录
    .excludePathPatterns(“/user/**”,“/file/upload”);//需要放行的方法
    // .excludePathPatterns(“/user/login”,“/user/register”,“/user/import”,“/user/export”);//需要放行的方法
    }

    @Bean
    public JwtInterceptor jwtInterceptor(){
    return new JwtInterceptor();
    }
    }文章来源地址https://www.toymoban.com/news/detail-453081.html

到了这里,关于Java实现基于token认证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入解析 MQTT 中基于 Token 的认证和 OAuth 2.0

    除了前几篇文章中提到的认证方法,本文将对其他认证方法进行深入分析和探讨。 具体而言,我们将深入了解基于 Token 的认证和 OAuth 2.0,阐述它们的原理并展示它们在 MQTT 中的应用。 让我们先来认识一下基于 Token 的认证,了解它相较于传统的用户名和密码认证的一些优势

    2024年02月15日
    浏览(40)
  • Springboot+redis实现token的登录认证

    1.在用户登录后,如果要访问其他路径下的资源的话,我们是否还需要再验证一遍呢?而且我们登陆上系统长时间不操作的话还需不需要再次验证?所以这种情况下就很需要token来实现登录功能。并通过redis(redis是一个key-value存储系统,它支持存储的value类型相对更多,包括

    2023年04月09日
    浏览(98)
  • 使用Token方式实现用户身份鉴权认证

    Token,也称为“令牌”,是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。比如如下形式: 39faf62271944fe48c4f1d69be71bc9a 传

    2024年02月11日
    浏览(42)
  • SpringSecurity实现前后端分离登录token认证详解

    目录 1. SpringSecurity概述 1.1 权限框架 1.1.1 Apache Shiro 1.1.2 SpringSecurity 1.1.3 权限框架的选择 1.2 授权和认证 1.3 SpringSecurity的功能 2.SpringSecurity 实战 2.1 引入SpringSecurity 2.2 认证 2.2.1 登录校验流程  2.2.2 SpringSecurity完整流程  2.2.3 认证流程详解 2.3 思路分析 2.4 代码实战 2.4.1  自定义

    2024年02月08日
    浏览(50)
  • 为什么使用双token实现无感刷新用户认证?

    认证机制 :对与单token的认证机制在我们项目中仅使用一个Access Token的访问令牌进行用户身份认证和授权的方案处理。 不足之处: 安全性较低(因为只有一个token在客户端和服务器端之间进行传递,一目Acess Token被截获或者被泄露,攻击者就会在有效时间内完成模拟用户行为,

    2024年01月18日
    浏览(49)
  • springBoot JWT实现websocket的token登录拦截认证

    功能:所有关于websocket的请求必须登录,实现websocket需要登录后才可使用,不登录不能建立连接。 后台spring security配置添加websocket的请求可以匿名访问,关于websocket的请求不要认证就可以随意访问,去除匿名访问后,前端在与websocket建立链接无法在请求头里直接加入Authoriz

    2024年02月13日
    浏览(49)
  • 3-2. SpringBoot项目集成【用户身份认证】实战 【实战核心篇】基于JWT生成和校验Token

    书接上文 技术选型篇,我们做了【用户身份认证】的技术选型说明,对基于 Session、Token、JWT 的方案进行了详细的对比分析,详细说明了它们都是什么和各自的优缺点!这些是实战的基础,还没看过的同学,建议先看上文。最终采用的是目前流行的 基于JWT的Token用户身份认证

    2023年04月08日
    浏览(51)
  • 3-1. SpringBoot项目集成【用户身份认证】实战 【技术选型篇】基于Session、Token、JWT怎么选?

    通过第二章2-2. SpringBoot API开发详解 --SpringMVC注解+封装结果+支持跨域+打包,我们实现了基于SpringBoot项目的 API接口开发 ,并实现 API结果统一封装、支持跨域请求 等等功能,接下来开始第三章,主要做用户身份认证,主要实现一套 统一鉴权的用户身份认证的机制 。 我已经提

    2024年01月22日
    浏览(55)
  • springboot整合Sa-Token实现登录认证和权限校验(万字长文)

    目前在国内的后端开发中,常用的安全框架有spring security、shiro。现在,介绍一款由国人开发的安全框架Sa-Token。这个框架完全由国人开发,所提供的Api文档和一些设置都是比较符合国人的开发习惯的,本次就来介绍一下如何在spring boot框架中整合Sa-Token框架,以实现我们最常

    2024年04月27日
    浏览(44)
  • 【论文代码】基于隐蔽带宽的汽车控制网路鲁棒认证-到达时间间隔通道的Java实现(一)

    此篇文章是对原有代码的注释进行翻译,尝试对其架构和实现方式进行理解。 项目结构 Java实现代码 如图UML类图: 从图中明显可见,其代码组织方式,各个代码文件的继承和实现的关系。 以下内容围绕UML类图,分别进行阐述。 USBtin家族 USBtin是所有类的基类。 CANSender 和CA

    2024年01月24日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包