Spring Boot 集成JWT实现前后端认证的示例代码

下面是详细讲解“Spring Boot集成JWT实现前后端认证的示例代码”的攻略。

什么是JWT

JWT全称为JSON Web Token。它是一种轻量级的身份验证机制,可以用于前后端之间的认证和授权。使用JWT进行认证,可以避免服务端为每个客户端的请求保存会话状态,从而提高服务的可伸缩性。

JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。头部包含了一些元数据,描述了令牌的类型和加密算法等;载荷包含了一些自定义的数据,比如用户的ID等;签名则显示了JWT的完整性,确保令牌没有被篡改。

JWT的优势

使用JWT进行认证比传统的cookie 或session认证具有一些优势:

  1. 无状态性:JWT在完成身份认证之后,不需要保存会话状态。客户端可以在每个请求中传递JWT,由服务端进行验证。因此,服务端的资源需要更少。

  2. 可扩展性:由于JWT是基于自包含的JSON结构,所以可以用于扩展其他数据。

  3. 安全性:JWT使用签名来验证令牌的完整性,防止令牌被篡改。此外,可以使用SSL/TLS来保护令牌。

现在我们开始来讲解如何在Spring Boot中集成JWT实现前后端认证。

步骤一:引入依赖

在pom.xml文件中加入以下依赖:

<!--JWT令牌实现-->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.0</version>
</dependency>

步骤二:添加JWT的配置类

在Spring Boot项目中添加JWT的配置类,其中包括:

  1. 生成JWT的方法

  2. 解析JWT的方法

  3. 配置JWT的一些参数

@Configuration
public class JwtConfig {

  // 生成JWT的方法
  public static String createToken(Map<String, Object> claims, String subject) {
    long nowMillis = System.currentTimeMillis();
    Date now = new Date(nowMillis);

    JwtBuilder builder = Jwts.builder()
        .setClaims(claims)
        .setSubject(subject)
        .setIssuedAt(now)
        .signWith(SignatureAlgorithm.HS256, "secret");

    long expMillis = nowMillis + 120 * 60 * 1000; // 2小时有效期
    Date exp = new Date(expMillis);
    builder.setExpiration(exp);

    return builder.compact();
  }

  // 解析JWT的方法
  public static Claims parseToken(String token) {
    try {
      return Jwts.parser()
          .setSigningKey("secret")
          .parseClaimsJws(token)
          .getBody();
    } catch (Exception e) {
      return null;
    }
  }

  // 配置JWT参数
  @Bean
  public JwtAccessTokenConverter jwtAccessTokenConverter() {
    JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
    converter.setSigningKey("secret");
    return converter;
  }

  @Bean
  public JwtTokenStore jwtTokenStore() {
    return new JwtTokenStore(jwtAccessTokenConverter());
  }

  @Bean
  public TokenEnhancer jwtTokenEnhancer() {
    return new JwtTokenEnhancer();
  }

  // JWT token增加自定义属性
  class JwtTokenEnhancer implements TokenEnhancer {
    @Override
    public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
      Map<String, Object> info = new HashMap<>();
      // 添加自定义属性,如用户ID等
      info.put("user_id", 1);
      ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(info);
      return accessToken;
    }
  }
}

步骤三:配置Spring Security

加入以下配置类配置Spring Security。其中包括了继承WebSecurityConfigurerAdapter的指定JWT的认证方式,还包括了继承AuthorizationServerConfigurerAdapter的认证授权方式。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter
        implements AuthorizationServerConfigurer {

  @Autowired
  private AuthenticationManager authenticationManager;

  @Autowired
  private JwtTokenEnhancer jwtTokenEnhancer;

  @Autowired
  private JwtConfig jwtConfig;

  @Override
  protected void configure(HttpSecurity httpSecurity) throws Exception {
    httpSecurity.csrf().disable()
        .exceptionHandling()
        .and()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
        .authorizeRequests().anyRequest().authenticated()
        .and()
        .apply(new JwtConfigurer(jwtConfig, jwtTokenEnhancer));
  }

  @Override
  public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    String secret = "{noop}secret";
    clients.inMemory()
        .withClient("client")
        .secret(secret)
        .scopes("read", "write")
        .authorizedGrantTypes("password", "refresh_token")
        .accessTokenValiditySeconds(3600)
        .refreshTokenValiditySeconds(7200)
        .and()
        .withClient("webapp")
        .secret(secret)
        .scopes("trust")
        .authorizedGrantTypes("implicit")
        .accessTokenValiditySeconds(3600);
  }

  @Override
  public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
    TokenEnhancerChain enhancerChain = new TokenEnhancerChain();
    enhancerChain.setTokenEnhancers(Arrays.asList(jwtTokenEnhancer, jwtConfig.jwtAccessTokenConverter()));

    endpoints.authenticationManager(authenticationManager)
        .tokenStore(jwtConfig.jwtTokenStore())
        .tokenEnhancer(enhancerChain);
  }

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
        .withUser("user").password("{noop}password").roles("USER");
  }
}

示例一:生成JWT

下面是一个示例代码,用于在用户登录时生成一个JWT:

// 生成JWT
Map<String, Object> claims = new HashMap<>();
claims.put("sub", "user"); // 用户名等可定义的声明
String token = JwtConfig.createToken(claims, "user");

在这个示例中,生成JWT时传入了一个Map类型的claims,用于定义一些自定义的数据,比如用户名等。同时,在setExpiration中指定了JWT的过期时间为2小时。

示例二:解析JWT

下面是一个示例代码,用于在Spring Boot应用中解析JWT:

// 解析JWT
String token = "Bearer xxxx"; // 从Authorization头中提取出token
Claims claims = JwtConfig.parseToken(token);
if (claims != null) {
    String username = claims.getSubject();
    // todo: 验证用户凭据
} else {
    // todo: token无效
}

在这个示例中,解析JWT时调用了JwtConfig类中的parseToken方法,传入了从Authorization头中提取出的token。在parseToken方法中,使用Jwts.parser()解析JWT,并使用setSigningKey("secret")方法指定了密钥为secret。如果解析成功,则可以获得一些自定义的数据,比如用户名等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot 集成JWT实现前后端认证的示例代码 - Python技术站

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

相关文章

  • Tomcat 9 免安装版配置的图文教程(详)

    下面我将为您详细讲解“Tomcat 9 免安装版配置的图文教程(详)”的完整攻略。 一、前言 在本攻略中,我将为您介绍如何配置Tomcat 9免安装版,以便在Windows电脑上搭建Java Web开发环境。Tomcat是一种非常流行的Java应用服务器,由Apache提供支持,并且具有良好的性能和稳定性。本攻略中的操作步骤适用于Windows 7、Wind…

    Java 2023年5月19日
    00
  • 利用Java如何获取Mybatis动态生成的sql接口实现

    获取Mybatis动态生成的sql接口实现,需要使用到 Mybatis 的反射机制。以下是具体的操作步骤: 步骤一:定义接口 首先,我们需要在 Mybatis 中定义一个 Mapper 接口,这个接口的方法要跟我们要获取的实现方法一致,例如查询方法: public interface UserMapper { List<User> getUser…

    Java 2023年5月20日
    00
  • jQuery实现遍历XML节点和属性的方法示例

    下面是jQuery实现遍历XML节点和属性的方法示例的详细攻略。 1. 准备XML数据 首先,需要准备一份XML格式的数据。如果手头没有可以使用的XML数据,可以自己创建一个XML文件。 <?xml version= "1.0" encoding= "UTF-8"?> <bookstore> &…

    Java 2023年5月19日
    00
  • spring打包到jar包的问题解决

    下面是“spring打包到jar包的问题解决”的完整攻略: 背景介绍 使用Spring框架开发Java应用程序时,我们需要将程序打包成可执行的jar包,以方便部署和使用。但是在打包过程中可能会遇到一些问题,比如依赖jar包冲突、资源文件无法加载等等。下面介绍一些常见问题及其解决方法。 问题一:依赖jar包冲突 当我们在编写程序时使用了一些第三方jar包时,可…

    Java 2023年5月19日
    00
  • response.setHeader参数、用法的介绍

    当我们使用Node.js写网站时,有时候需要通过设置response头信息来对客户端请求做出响应。response header就是指这些头信息。 在Node.js中,我们可以使用response对象中的setHeader方法来设置response header。 下面是关于response.setHeader的详细介绍: response.setHeade…

    Java 2023年6月15日
    00
  • MyEclipse怎么设置性能才能达到最佳?

    MyEclipse是一款集成开发环境(IDE),使用该IDE能够为Java开发提供有效的工具和特性。MyEclipse有许多内置功能和选项,可以调整各种配置以提高性能和效率。以下是设置MyEclipse性能的攻略: 1. 显式地配置JVM MyEclipse是基于Java开发的IDE,其虚拟机运行在Java虚拟机上(JVM)。了解和调整JVM设置是提高性能的…

    Java 2023年5月20日
    00
  • java简单实现八叉树图像处理代码示例

    下面我将为您详细讲解“Java简单实现八叉树图像处理代码示例”的完整攻略。 什么是八叉树 八叉树是一种多叉树结构,它的每个非叶子结点都有八个孩子结点。在计算机视觉和计算机图形学中,八叉树被广泛应用于图像处理中的分割和压缩等领域。 八叉树在图像处理中的应用 将一幅图像划分为多个小块是图像处理中的一种重要方法,八叉树就是在图像划分中广泛应用的一种方法。通过将一幅…

    Java 2023年5月19日
    00
  • layer页面跳转,获取html子节点元素的值方法

    下面是关于layer页面跳转和获取html子节点元素值的完整攻略: layer页面跳转 在网站开发过程中,layer弹窗是一个非常常用的提示框和交互框架。在进行页面跳转时,我们可以使用layer.open()方法实现,方法语法如下: layer.open({ title: ‘弹出窗口标题’, type: 2, content: ‘弹出窗口链接地址’, are…

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