利用Springboot实现Jwt认证的示例代码

本文将为大家详细讲解如何使用Spring Boot实现JWT认证,并提供两个示例说明。请按照下面的步骤操作。

前置条件

在开始之前,您需要了解:

  • Java及其相关技术(Java web开发、Spring Boot框架等);
  • JWT(JSON Web Token)认证方式的基本概念和使用方法。

步骤

1. 添加依赖

请在您的项目中添加Spring Security和JWT相关的依赖项,例如:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

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

2. 添加JWT配置

application.properties中添加JWT相关配置,例如:

jwt.secret=secret-key
jwt.expiration=86400000

其中jwt.secret是用于创建和解析JWT的密钥,jwt.expiration是JWT过期时间(单位为毫秒)。

3. 创建JWT工具类

创建一个用于创建和解析JWT的工具类JwtUtils,该类的代码如下:

@Component
public class JwtUtils {
    @Value("${jwt.secret}")
    private String secret;

    @Value("${jwt.expiration}")
    private Long expiration;

    public Claims getClaimsFromToken(String token) {
        return Jwts.parser()
                .setSigningKey(secret)
                .parseClaimsJws(token)
                .getBody();
    }

    public String generateToken(Map<String, Object> claims) {
        Date expirationDate = new Date(System.currentTimeMillis() + expiration);
        return Jwts.builder()
                .setClaims(claims)
                .setExpiration(expirationDate)
                .signWith(SignatureAlgorithm.HS512, secret)
                .compact();
    }

    public boolean validateToken(String token, UserDetails userDetails) {
        try {
            String username = getClaimsFromToken(token).getSubject();
            return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
        } catch (Exception ex) {
            return false;
        }
    }

    private boolean isTokenExpired(String token) {
        Date expirationDate = getClaimsFromToken(token).getExpiration();
        return expirationDate.before(new Date());
    }
}

其中包括以下方法:

  • getClaimsFromToken:从JWT字符串中获取声明(Claims);
  • generateToken:创建一个新的JWT并添加声明;
  • validateToken:验证JWT是否有效;
  • isTokenExpired:检查JWT是否过期。

4. 实现认证授权

SecurityConfig中配置Spring Security,实现认证授权,例如:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private JwtUtils jwtUtils;

    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
        provider.setPasswordEncoder(passwordEncoder());
        provider.setUserDetailsService(userDetailsService);
        return provider;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/api/login").permitAll()
                .anyRequest().authenticated()
                .and()
                .addFilter(new JwtAuthenticationFilter(authenticationManager(), jwtUtils))
                .addFilter(new JwtAuthorizationFilter(authenticationManager(), jwtUtils))
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .csrf().disable();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authenticationProvider());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

其中,DaoAuthenticationProvider是用于从数据库中获取用户信息的认证提供者,JwtAuthenticationFilterJwtAuthorizationFilter是自定义的过滤器,在请求到达之前或响应返回之后实现JWT的创建和验证。

示例 1:实现登录逻辑

我们将实现一个简单的登录逻辑,该逻辑将使用JWT身份验证。示例代码如下:

@RestController
@RequestMapping("/api")
public class LoginController {
    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private JwtUtils jwtUtils;

    @PostMapping("/login")
    public ResponseEntity<?> login(@RequestBody AuthenticationRequest authenticationRequest) {
        Authentication authentication = authenticationManager.authenticate(
                new UsernamePasswordAuthenticationToken(
                        authenticationRequest.getUsername(),
                        authenticationRequest.getPassword()
                )
        );

        SecurityContextHolder.getContext().setAuthentication(authentication);

        Map<String, Object> claims = new HashMap<>();
        claims.put("roles", authentication.getAuthorities());

        String token = jwtUtils.generateToken(claims);

        return ResponseEntity.ok(new AuthenticationResponse(token));
    }
}

其中,AuthenticationManager是Spring Security用于身份验证的类,AuthenticationRequestAuthenticationResponse是用于登录请求和响应的类。

示例 2:实现访问控制

我们将实现一个访问控制的示例,目的是测试JWT是否有效。通过将一个注释添加到UserController上,我们将防止未经身份验证的用户访问它。示例代码如下:

@RestController
@RequestMapping("/api")
public class UserController {
    @GetMapping("/user")
    @PreAuthorize("hasRole('ROLE_USER')")
    public ResponseEntity<String> getUser() {
        return ResponseEntity.ok("Hello, user!");
    }
}

@PreAuthorize("hasRole('ROLE_USER')")注释添加到getUser()方法上,只有带有“ROLE_USER”角色的用户才能访问该API。

总结

本文介绍了如何使用Spring Boot实现JWT认证,并提供了两个示例说明。实现身份验证的重点在于创建和验证JWT,而使用Spring Security可以轻松地将其集成到现有的Web应用程序中。通过学习并应用JWT认证方式,您可以更加安全、高效地维护和管理Web应用程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用Springboot实现Jwt认证的示例代码 - Python技术站

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

相关文章

  • Java 超详细讲解核心类Spring JdbcTemplate

    Java 超详细讲解核心类 Spring JdbcTemplate 什么是 Spring JdbcTemplate? Spring JdbcTemplate 是 Spring Framework 的一个核心类,它是用于简化 JDBC 开发的一种方式。使用 Spring JdbcTemplate,我们可以不需要编写冗余的 JDBC 代码,而是通过简洁的 API…

    Java 2023年6月2日
    00
  • Java中的接口是什么?

    Java中的接口是一种特殊类型的抽象类,它定义了一组标准规范,用于实现类在特定情况下应该采取的行为。接口本身不能被实例化,但是可以被类实现,从而实现接口定义的标准规范。 Java中的接口主要具有以下特点: 接口中的所有方法都是抽象的,不能包含实现。 接口中的所有方法默认是public的,不能使用其他类型的访问修饰符。 接口中可以定义属性,但是这些属性默认是s…

    Java 2023年4月28日
    00
  • JSP JavaBean的setProperty属性

    下面是关于JSP JavaBean的setProperty属性的完整攻略。 什么是JSP JavaBean的setProperty属性? JSP JavaBean的setProperty属性,是指在JSP页面中,对JavaBean的属性进行设置的操作。使用setProperty属性,可以在JSP页面中为JavaBean的属性赋值,并更新JavaBean中属性…

    Java 2023年6月15日
    00
  • 详解Java Synchronized的实现原理

    接下来我就为您详细讲解“详解Java Synchronized的实现原理”的攻略。 标题:详解Java Synchronized的实现原理 一、基本概念 首先,我们需要了解Java Synchronized的基本概念。在Java中,Synchronized是一种同步机制,可以防止多个线程同时访问一个特定的代码块,从而避免数据不一致的问题。 二、内部原理 具体…

    Java 2023年5月26日
    00
  • 什么是虚拟化技术?

    以下是关于虚拟化技术的完整使用攻略: 什么是虚拟化技术? 虚拟化技术是一种将物理计算机资源(如处理器、内存、存储器等)抽象为个虚拟计算机的技术。它可以让多个虚拟计算机在同一物理计算机上运行,从而提高计算机资源的利用率和灵活性。 虚拟化技术的分类 虚拟化技术可以分为以下几种: 完全虚拟化:在完全虚拟化中,虚拟机可以运行不同的操作系统,且不需要对操作系统修改。它…

    Java 2023年5月12日
    00
  • 浅析Spring的JdbcTemplate方法

    浅析Spring的JdbcTemplate方法 什么是JdbcTemplate JdbcTemplate是Spring Framework提供的JDBC抽象层工具类之一,封装了JDBC操作的常用方法,以达到简化JDBC代码的目的。 JdbcTemplate的优点 使用JdbcTemplate进行JDBC操作,可以带来以下好处: 不必关心JDBC的繁琐的操作,…

    Java 2023年5月20日
    00
  • SpringMVC实现文件上传和下载功能

    SpringMVC实现文件上传和下载功能 Spring MVC提供了很好的机制来实现文件上传和下载功能,但需要借助一些依赖包和配置设置。 1. 添加MultipartResolver Bean 在Spring MVC应用中,我们需要添加一个MultipartResolver Bean以处理文件上传的请求。MultipartResolver 接口定义了文件上传…

    Java 2023年6月15日
    00
  • IDEA Maven 配置备忘笔记

    以下是使用 IntelliJ IDEA 配置 Maven 的完整攻略: 1. 下载安装 Maven Maven 是一个 Java 项目构建工具,它可以管理依赖,编译、打包、发布项目等。在安装 Maven 前,需要确认 Java 已经安装并配置好环境变量 PATH。 下载 Maven Maven 官网下载地址:https://maven.apache.org/…

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