详解基于JWT的springboot权限验证技术实现

详解基于JWT的springboot权限验证技术实现攻略

前言

本篇攻略将讲解基于JWT身份验证技术实现SpringBoot权限验证的具体流程。JWT(Json Web Token)是一种跨域身份验证方式,它将一些基本的身份信息以Json格式的数据段形式加密成一个字符串,比如在大型网站的前后端分离架构中JWT技术被广泛应用。

JWT的优势

JWT作为一种跨域身份验证方式,有以下几个优势:

  • 纯前端实现
  • 无状态,可扩展
  • 安全性高,不需要暴露密码等敏感信息

JWT实现原理

JWT实现原理如下:

  1. 用户登录时,服务器将用户的标识(用户名或用户ID等信息)加密生成一个Token,并返回给用户。
  2. 用户在随后的请求中都需要携带这个Token。
  3. 服务器通过验证Token来识别用户身份。
  4. 在Token中加入有效期限制,可以使Token在过期前失效,增加了安全性。

实现步骤

以下将介绍具体实现步骤,包括环境搭建、依赖导入、JWT Token加密、权限验证等等。

环境搭建

在本地安装好JDK后,可以使用如下命令初始化一个SpringBoot项目:

$ curl https://start.spring.io/starter.zip \
  -d dependencies=web,devtools \
  -d javaVersion=11 \
  -d type=maven-project \
  -d packaging=jar \
  -o myproject.zip

执行如下命令解压缩myproject.zip包:

$ unzip myproject.zip -d myproject

进入myproject文件夹并打开项目环境,即可开始进行项目开发。

依赖导入

在pom.xml文件中添加如下依赖:

<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt</artifactId>
  <version>0.9.1</version>
</dependency>

JWT Token加密

在该项目中,使用JwtBuilder方法进行Token加密。

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class JwtUtils {
  private static final String SECRET_KEY = "your-secret-key";

  public static String generateToken(String subject, long ttlMillis) {
    if (ttlMillis <= 0) {
      throw new RuntimeException("expiration time must be greater than 0.");
    }

    long nowMillis = System.currentTimeMillis();
    Date now = new Date(nowMillis);

    byte[] secretKeyBytes = DatatypeConverter.parseBase64Binary(SECRET_KEY)

    JwtBuilder builder = Jwts.builder()
          .setId(UUID.randomUUID().toString())
          .setSubject(subject)
          .setIssuedAt(now)
          .signWith(SignatureAlgorithm.HS256, secretKeyBytes);

    if (ttlMillis > 0) {
      long expMillis = nowMillis + ttlMillis;
      Date exp = new Date(expMillis);
      builder.setExpiration(exp);
    }

    return builder.compact();
  }
}

权限验证

在该示例中使用JwtParser方法进行Token验证。

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

public class JwtUtils {
  private static final String SECRET_KEY = "your-secret-key";

  public static Claims parseJwtToken(String token) {
    try {
      byte[] secretKeyBytes = DatatypeConverter.parseBase64Binary(SECRET_KEY)

      Claims claims = Jwts.parser()
          .setSigningKey(secretKeyBytes)
          .parseClaimsJws(token)
          .getBody();

      return claims;
    } catch (Exception e) {
      // handle token validation exception
      return null;
    }
  }
}

以上就是JWT实现SpringBoot权限验证的详细流程。在实现过程中需要注意保证安全性,使用合适秘钥+算法加密,并设置Token有效期限制等。

示例

示例1:使用JWT实现用户登录

在用户登录接口中调用JwtUtils.generateToken方法生成Token,将Token返回给前端。

@PostMapping("/login")
public ResponseEntity<Map<String, String>> login(@RequestBody LoginForm loginForm) {
  // ... user login logic
  String token = JwtUtils.generateToken(subject, ttlMillis);
  Map<String, String> response = new HashMap<>();
  response.put("token", token);
  return ResponseEntity.ok().body(response);
}

示例2:使用JWT实现接口权限控制

使用Spring Security实现接口权限控制,判断请求中的Authorization头部是否包含JWT Token。

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers("/api/v1/public/**").permitAll()
        .antMatchers("/api/v1/private/**").authenticated()
        .and().addFilterBefore(new JwtTokenFilter(),
            UsernamePasswordAuthenticationFilter.class);
  }
}

JwtTokenFilter继承OncePerRequestFilter并重写doFilterInternal方法进行Token验证和权限控制。

public class JwtTokenFilter extends OncePerRequestFilter {

  @Override
  protected void doFilterInternal(HttpServletRequest request,
      HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
    String token = extractToken(request);

    if (StringUtils.isBlank(token)) {
      chain.doFilter(request, response);
      return;
    }

    Claims claims = JwtUtils.parseJwtToken(token);
    if (claims == null) {
      response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
      return;
    }

    List<String> authorities = (List<String>) claims.get("authorities");
    List<SimpleGrantedAuthority> grantedAuthorities = authorities.stream()
        .map(SimpleGrantedAuthority::new)
        .collect(Collectors.toList());

    UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(
        claims.getSubject(),
        null,
        grantedAuthorities);

    SecurityContextHolder.getContext().setAuthentication(auth);
    chain.doFilter(request, response);
  }

  private String extractToken(HttpServletRequest request) {
    String authHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
    if (StringUtils.isBlank(authHeader)) {
      return null;
    }
    return authHeader.replaceFirst("Bearer ", "");
  }
}

以上两个示例展示了如何在SpringBoot项目中使用JWT实现用户登录和接口权限控制。

结语

本篇文章介绍了JWT实现SpringBoot权限验证的详细流程,同时配合实例操作帮助理解,希望能够帮助到大家。

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

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

相关文章

  • 全面解析Spring Security 内置 Filter

    全面解析Spring Security 内置 Filter 什么是Spring Security Spring Security 是一个完全基于 Spring Framework 的企业应用系统安全性管理框架,提供了诸如身份认证、授权、攻击防范等企业安全所需的基本功能,并且提供了丰富的扩展点,可以根据需求进行二次开发。 Spring Security 内置 …

    Java 2023年5月20日
    00
  • 浅谈Spring5 响应式编程

    下面就给你详细讲解“浅谈Spring5 响应式编程”的完整攻略。 什么是响应式编程 响应式编程(Reactive Programming)是一种数据流处理的编程范式,主要用于处理异步数据流。响应式编程有两个关键概念:Observable和观察者(Observer)。Observable表示数据流,观察者用来监听数据流并进行相应的处理。当Observable发…

    Java 2023年5月19日
    00
  • CentOS安装solr 4.10.3详细教程

    CentOS安装solr 4.10.3详细教程 简介 Solr是一个开源的全文搜索引擎,使用Java编写,基于Apache Lucene构建。Solr可以用作独立的全文搜索服务器,也可以与其他应用程序集成。 本文将提供在CentOS上安装Solr 4.10.3的完整教程。 步骤 步骤1:安装Java 由于Solr是使用Java编写的,因此必须先安装Java。…

    Java 2023年6月2日
    00
  • SpringBoot如何优雅的处理校验参数的方法

    当我们使用SpringBoot开发项目时,校验参数是一个很常见的需求。如何优雅地处理校验参数,可以让我们的代码更加简洁易懂,也能更好地保证代码的可维护性。下面我将分享一些处理校验参数的优雅方法。 1. 使用Hibernate Validator Hibernate Validator是一个基于JSR 303规范的校验框架,它可以让我们非常方便地对参数进行校验…

    Java 2023年5月20日
    00
  • Java获取凌晨时间戳的方法分析

    以下是“Java获取凌晨时间戳的方法分析”的完整攻略。 标题 Java获取凌晨时间戳的方法分析 简介 在某些业务场景下,需要获取凌晨的时间戳,比如签到功能,需要判断用户是否在当天的凌晨进行签到。本文从获取当天零点时间戳的角度来进行分析,并提供实例。 步骤 1.使用Calendar类 最简单的方法是使用Calendar类,获取当前时间并将其设置为零点。代码如下…

    Java 2023年5月20日
    00
  • Java对日期Date类进行加减运算、年份加减月份加减、时间差等等

    Java 8 提供了一组全新的日期和时间库,其中 LocalDate、LocalTime、LocalDateTime 用于代替旧的 Date、Calendar 等类。下面主要介绍 LocalDate 的日期加减、年份月份加减、时间差的处理方法。 日期加减 使用 plusDays(long daysToAdd) 方法可以对日期进行加操作,该方法返回一个新的日期…

    Java 2023年5月20日
    00
  • MybatisPlus如何处理Mysql的json类型

    下面是MybatisPlus如何处理MySQL的Json类型的攻略: 背景 MySQL从5.7开始支持Json类型。对于Java开发者来说,通常使用json字符串表示json类型的数据。在开发过程中,可能需要把json字符串映射成Java对象并进行持久化或者把Java对象转换成json字符串进行传输。在使用MybatisPlus做ORM开发时,可以通过使用@…

    Java 2023年5月26日
    00
  • JavaScript Uploadify文件上传实例

    下面是JavaScript Uploadify文件上传实例的完整攻略,主要包括以下几个部分: 1. 环境搭建 在开始之前,需要将环境搭建好,确保能够正常运行。需要安装以下两个组件: jQuery库(版本>=1.7) Uploadify插件(版本>=3.2) 2. HTML结构 在HTML页面中,需要创建一个file input来选择需要上传的文件…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部