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

我将为您详细讲解如何实现基于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日

相关文章

  • vue实现输入框的模糊查询的示例代码(节流函数的应用场景)

    我来详细讲解一下“Vue实现输入框的模糊查询的示例代码(节流函数的应用场景)”。 1. 简介 输入框模糊查询是Web开发中常见的功能,Vue作为流行的前端框架,可以很方便的实现这个功能,并且由于其响应式特性,在用户输入信息时不需要刷新整个页面,提供了更好的用户体验。 2. Vue实现输入框的模糊查询的示例代码 下面是一个简单的输入框模糊查询的示例: <…

    Vue 2023年5月27日
    00
  • 详解组件库的webpack构建速度优化

    我会详细地讲解“详解组件库的webpack构建速度优化”的完整攻略。本攻略旨在帮助组件库作者和使用者优化webpack构建速度,提高工作效率。 什么是webpack构建速度优化? 首先,让我们明确一下什么是webpack构建速度优化。在开发过程中,webpack的构建速度是非常重要的。随着项目体量增大,构建时间会越来越长,这会影响我们的效率和开发速度。因此,…

    Vue 2023年5月28日
    00
  • vue开发之moment的介绍与使用

    Vue开发之Moment的介绍与使用 Moment.js介绍 Moment.js是一个专门用来解析、显示和操作日期时间数据的JavaScript库,提供了各种格式化、时间计算、日期相差、本地化和持续时间等功能,非常实用。 Moment.js可以用在浏览器端和Node.js环境下,可以通过npm或直接引入CDN来使用。同时,Moment.js也支持在Vue和其…

    Vue 2023年5月29日
    00
  • vue data恢复初始化数据的实现方法

    当使用Vue.js时,有时候有必要恢复某些数据的值为初始化值,以便重新开始处理。Vue.js提供了一个简单的方法来实现这个功能。我们可以在Vue实例中定义一个data初始化方法,该方法将在Vue实例被实例化时被调用。然后,我们可以在需要恢复数据的时候调用这个方法来初始化数据。下面是实现方式的详细攻略: 步骤一:定义data初始化方法 在Vue实例中定义一个d…

    Vue 2023年5月28日
    00
  • vue如何搭建多页面多系统应用

    要搭建多页面多系统应用,我们需要考虑以下几个方面: 如何配置webpack多入口 如何分别打包多个页面 如何创建多个vue实例 如何在不同的页面中加载不同的组件 下面我们逐一讲解: 1. 如何配置webpack多入口 我们可以在webpack.config.js中配置entry来指定多个入口文件,示例代码如下: module.exports = { entr…

    Vue 2023年5月28日
    00
  • 为Vue3 组件标注 TS 类型实例详解

    为Vue3组件标注TS类型实例详解, 为什么要在Vue3中为组件标注TS类型 Vue3已经全面拥抱TypeScript,Vue2中虽然也可以使用TypeScript,但是不如在Vue3中使用简单直观。为Vue3中的组件标注TS类型能够帮助我们减少代码出错的可能性,能够在开发阶段就发现类型不匹配的问题。因为标注了TS类型,编辑器也可以给我们更好的编码体验,例如…

    Vue 2023年5月27日
    00
  • electron vue 模仿qq登录界面功能实现

    好的!接下来我会详细讲解“electron vue 模仿qq登录界面功能实现”的完整攻略。 首先,你需要了解以下内容: Electron:一个使用 JavaScript、HTML 和 CSS 等 Web 技术创建桌面应用程序的开源框架; Vue.js:一款渐进式 JavaScript 框架,易于上手、轻量级且易于扩展; vue-cli-plugin-elec…

    Vue 2023年5月28日
    00
  • Vue 计数器的实现

    下面是“Vue 计数器的实现”攻略。 什么是 Vue 计数器 Vue 计数器是一个非常简单的 Web 应用程序,它包含一个数字和两个按钮:加和减。点击按钮可以增加或减少数字。Vue 计数器通常用作 Vue 初学者的教学示例,因为它涉及到了 Vue 组件之间的交互和状态管理,但对于有经验的开发者来说,实现它并不复杂。 Vue 计数器的实现步骤 步骤 1:创建一…

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