基于JWT的spring boot权限验证技术实现教程

yizhihongxing

我将为您详细讲解如何实现基于JWT的Spring Boot权限验证技术。

1. JWT 的概念

JWT(JSON Web Token)是一种使用 JSON 格式编写的 token(令牌)标准,并且可被用于浏览器和移动端之间的身份认证。

JWT 由三部分组成:头部(header)、载荷(payload)和签名(signature)。

  • 头部(header):包含了 token 的类型(即 JWT)、使用的算法等信息。
  • 载荷(payload):用于存放实际请求时所携带的数据。其中包含了用户的信息、有效期等信息。
  • 签名(signature):使用密钥对头部和载荷进行签名生成的字符串,以保证 token 的安全性。

2. Spring Boot 中 JWT 的使用

在 Spring Boot 中,我们可以使用一些第三方库来实现 JWT 的使用,如 jjwt 等。

2.1. 添加 jjwt 依赖

首先,在我们的项目中添加 jjwt 依赖:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.11.2</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>0.11.2</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>0.11.2</version>
    <scope>runtime</scope>
</dependency>

2.2. 配置 SecretKey

接下来,我们需要生成一个 SecretKey,用于对 JWT 进行签名,可以将 SecretKey 的生成放在一个配置类中:

import io.jsonwebtoken.security.Keys;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.crypto.SecretKey;

@Configuration
public class JwtConfig {

    private final String secret = "mySecretKeyForJwt";

    @Bean
    public SecretKey secretKey() {
        return Keys.hmacShaKeyFor(secret.getBytes());
    }
}

2.3. 生成 Token

接下来,我们可以使用 jjwt 库生成一个 JWT token,示例代码如下:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.util.Date;

public class JWTTokenProvider {

    // 过期时间为 10 分钟
    private static final long EXPIRATION_TIME = 10 * 60 * 1000;

    private final SecretKey secretKey;

    public JWTTokenProvider(SecretKey secretKey) {
        this.secretKey = secretKey;
    }

    public String generateToken(User user) {

        Date now = new Date();
        Date expiryDate = new Date(now.getTime() + EXPIRATION_TIME);

        return Jwts.builder()
                .setSubject(Long.toString(user.getId()))
                .setIssuedAt(now)
                .setExpiration(expiryDate)
                .signWith(secretKey)
                .compact();
    }
}

其中,setSubject() 方法可以设置用户名等信息,setIssuedAt() 方法表示创建时间,setExpiration() 方法表示过期时间。最后使用 signWith() 方法对 token 进行签名。

2.4. 验证 Token

在实际的应用场景中,我们需要验证用户提交的 token 是否有效,代码示例如下:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;

import javax.crypto.SecretKey;
import java.util.Optional;

public class JWTTokenValidator {

    private final SecretKey secretKey;

    public JWTTokenValidator(SecretKey secretKey) {
        this.secretKey = secretKey;
    }

    public Optional<Long> getUserIdFromJWT(String token) {

        try {
            Jws<Claims> claims = Jwts.parser()
                    .setSigningKey(secretKey)
                    .parseClaimsJws(token);

            Claims body = claims.getBody();
            Long userId = Long.parseLong(body.getSubject());

            return Optional.of(userId);

        } catch (Exception ex) {
            return Optional.empty();
        }
    }
}

其中,Jwts.parser() 方法返回一个 JwtParser 对象,使用 setSigningKey() 方法设置密钥,使用 parseClaimsJws() 方法解析 token。如果解析成功,将返回一个 Claims 对象,可以从中获取用户的信息。

3. 示例说明

接下来,我将介绍两个示例:

3.1. 实现用户登录

用户登录成功后,我们可以使用上述方法生成一个 token,并返回给客户端。

@PostMapping("/login")
public ResponseEntity<?> authenticateUser(@Valid @RequestBody LoginRequest loginRequest) {

    // Authenticate User

    UserDetails userDetails = myUserDetailsService.loadUserByUsername(loginRequest.getUsername());

    String jwt = jwtTokenProvider.generateToken(userDetails);

    return ResponseEntity.ok(new JwtAuthenticationResponse(jwt));
}

在该示例中,我们将用户提交的用户名和密码进行验证,并使用 loadUserByUsername() 方法获取用户的详细信息。然后,将用户信息传入生成 token 的方法中,即可得到一个 token 并返回给客户端。

3.2. 验证用户访问权限

在某些场景下,我们需要验证用户是否有访问某一页面或资源的权限。示例代码如下:

@GetMapping("/private")
public ResponseEntity<?> getPrivateData(@CurrentUser UserPrincipal userPrincipal) {

    if(userPrincipal.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ADMIN"))) {
        return ResponseEntity.ok("You have access to this page.");
    } else {
        return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
    }
}

其中,@CurrentUser 注解代表当前登录用户,通过 userPrincipal.getAuthorities() 方法可以获取当前用户所拥有的权限,然后对权限进行判断并返回相应的结果。如果用户没有权限,我们可以直接返回一个 HttpStatusCode 为 Forbidden 的响应。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于JWT的spring boot权限验证技术实现教程 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 17个vue常用的数组方法总结与实例演示

    我们来详细讲解一下“17个vue常用的数组方法总结与实例演示”的完整攻略。 一、前言 在Vue中,我们经常需要操作数组。而对于数组的操作,Vue提供了许多方便快捷的方法。本文将对Vue中17个常用的数组方法进行总结和实例演示,方便大家学习和使用。 二、数组方法 1. push 向数组添加一个或多个元素,并返回新的长度。 let arr = [1,2,3]; …

    Vue 2023年5月27日
    00
  • 原生JS实现的自动轮播图功能详解

    “原生JS实现的自动轮播图功能详解”可以通过以下步骤实现: 1. 创建轮播图的html结构 在HTML文件中创建轮播图的结构,并给每一张图片设置一个唯一的编号作为id,以便在JS中引用。 例如,创建一个将包括5张照片的轮播器,结构如下: <div class="slider"> <img id="slide1&…

    Vue 2023年5月28日
    00
  • Vue不能下载xls以及文件乱码问题解决

    下面我来详细讲解Vue不能下载xls以及文件乱码问题的解决方法。 问题描述 在Vue项目中,可能出现下载xls文件时出现乱码或者无法下载的情况。这是因为Vue框架默认的数据传输格式是JSON,无法直接传输二进制文件,需要经过一定的处理解决才能实现文件下载。 解决方法 解决Vue不能下载xls以及文件乱码问题,需要进行以下几个步骤: 1. 设置服务端响应头 在…

    Vue 2023年5月28日
    00
  • vue实现指定区域自由拖拽、打印功能

    实现指定区域自由拖拽、打印功能的攻略如下: 准备 安装Vue和Vue-draggable插件 npm install vue vue-draggable 自由拖拽 在Vue的template中,使用vue-draggable插件的vuedraggable组件定义拖拽区域。 <template> <div> <h1>可拖拽项…

    Vue 2023年5月28日
    00
  • Vue插件从封装到发布的完整步骤记录

    当想要向其他开发者分享自己开发的 Vue 插件时,把它发布成独立的插件包是一种非常好的方式。下面是 Vue 插件从封装到发布的完整步骤记录: 步骤一:创建插件 创建一个项目文件夹,并在这个文件夹里利用 npm init 命令创建一个包描述文件(package.json)。 npm init 安装 Vue 及编写插件代码:在项目文件夹内,使用 npm inst…

    Vue 2023年5月28日
    00
  • js中什么时候不能使用箭头函数

    使用箭头函数的时候需要注意一些使用限制,下面详细讲解什么时候不能使用箭头函数以及注意事项。 不能使用箭头函数的情况 1. 不能作为构造函数 箭头函数不能作为构造函数,也就是不能使用 new 关键字创建对象。因为箭头函数没有自己的 this,也没有 prototype 属性。所以,如果你尝试使用 “箭头函数” 作为构造函数,则会产生异常。 // 箭头函数不能作…

    Vue 2023年5月28日
    00
  • JavaScript进阶(四)原型与原型链用法实例分析

    关于“JavaScript进阶(四)原型与原型链用法实例分析”的完整攻略,以下是详细讲解: 什么是原型 JavaScript 中的每个对象都有一个指向它的原型。原型是一个包含属性和方法的对象,它可以被用来共享那些在多个实例之间共享内容的属性和方法。当我们在一个实例中访问一个属性或者一个方法时,它会先在实例本身中查找该属性或方法,如果没有找到,就会去实例的原型…

    Vue 2023年5月28日
    00
  • Vue请求JSON Server服务器数据的实现方法

    当你使用Vue来开发Web应用时,你需要获取外部数据并在网页应用中展示这些数据。JSON Server是一个快速的、简单的node.js库,可以模拟RESTful APIs,生成假数据,并对数据进行增删改查操作。下面是在Vue中如何实现JSON Server服务器数据请求。 1. 安装JSON Server 首先,你需要安装JSON Server。在命令行中…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部