Java实战:JWT Token认证授权方案

本文将详细介绍如何在Spring Boot应用程序中实现JWT(JSON Web Token)Token认证授权。我们将探讨JWT的基本概念,以及如何使用Spring Boot和JWT库来实现认证和授权。此外,我们将通过具体的示例来展示如何在Spring Boot中创建和验证JWT Token。本文适合希望使用JWT Token认证授权的Spring Boot开发者阅读。

一、引言

在Web应用程序中,安全性是非常重要的一环。传统的基于Session的认证方式在分布式系统中存在一些问题,如Session管理复杂、跨域访问限制等。JSON Web Token(JWT)是一种轻量级、自包含、基于JSON的认证授权机制,它可以在客户端和服务器之间传递安全信息。Spring Boot提供了对JWT的直接支持,使得集成和使用JWT变得非常简单。

二、JWT的基本概念

1. 什么是JWT?
JWT是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象的形式安全地传输信息。JWT通常用于身份验证和授权,它可以包含用户身份信息、权限信息等,并可以通过数字签名来保证信息的完整性和安全性。
2. JWT的组成
JWT由三个部分组成:头部(Header)、有效载荷(Payload)和签名(Signature)。

  • 头部:包含了关于JWT的元数据,如类型、算法等。
  • 有效载荷:包含了用户身份信息、权限信息等。
  • 签名:通过对头部和有效载荷进行加密生成,用于验证JWT的完整性和真实性。

三、在Spring Boot中实现JWT Token认证授权

1. 添加JWT依赖
在项目的pom.xml文件中,添加Spring Boot的JWT依赖:

<dependencies>
    <!-- Spring Boot Web依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Spring Boot Security依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <!-- JWT依赖 -->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
</dependencies>

2. 配置JWT
在Spring Boot中,可以使用JwtConfigurerJwtTokenProvider类来配置JWT。以下是一个简单的JWT配置类示例:

package com.example.demo.config;
import com.example.demo.security.JwtTokenProvider;
import io.jsonwebtoken.security.Keys;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import java.security.Key;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public JwtTokenProvider jwtTokenProvider() {
        return new JwtTokenProvider(key());
    }
    @Bean
    public Key key() {
        return Keys.secretKeyFor(SignatureAlgorithm.HS256);
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .authorizeRequests()
                .antMatchers("/auth/**").permitAll() // 允许所有人访问认证接口
                .anyRequest().authenticated() // 其他请求都需要认证
            .and()
            .apply(jwtTokenFilterConfigurer(jwtTokenProvider()));
    }
}

3. 创建JWT Token过滤器
在Spring Boot中,需要创建一个JWT Token过滤器来验证请求中的Token。以下是一个简单的JWT Token过滤器示例:

package com.example.demo.security;
import com.example.demo.config.JwtConfig;
import com.example.demo.config.JwtTokenProvider;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.UnsupportedJwtException;
import io.jsonwebtoken.security.SignatureException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class JwtTokenFilter extends OncePerRequestFilter {
    @Autowired
    private JwtTokenProvider jwtTokenProvider;
    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain chain) throws ServletException, IOException {
        try {
            String token = jwtTokenProvider.resolveToken(request);
            if (token != null && jwtTokenProvider.validateToken(token)) {
                String username = jwtTokenProvider.getUsernameFromToken(token);
                UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, null, Collections.emptyList());
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        } catch (ExpiredJwtException | MalformedJwtException | UnsupportedJwtException | SignatureException e) {
            throw new RuntimeException("Invalid JWT token");
        }
        chain.doFilter(request, response);
    }
}

4. 创建认证接口
在Spring Boot中,创建一个认证接口来处理用户登录请求。以下是一个简单的认证接口示例:

package com.example.demo.controller;
import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AuthController {
    @Autowired
    private AuthenticationManager authenticationManager;
    @Autowired
    private JwtTokenProvider jwtTokenProvider;
    @Autowired
    private UserService userService;
    @PostMapping("/auth/login")
    public ResponseEntity<?> login(@RequestBody User user) {
        Authentication authentication = authenticationManager.authenticate(
                new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword()));
        SecurityContextHolder.getContext().setAuthentication(authentication);
        String jwt = jwtTokenProvider.createToken(authentication);
        return ResponseEntity.ok(new JwtAuthenticationResponse(jwt));
    }
}

5. 运行项目
将以上代码添加到我们的Spring Boot项目中,并运行项目。我们可以通过浏览器或Postman等工具访问http://localhost:8080/auth/login,并使用用户名和密码进行登录,观察JWT Token认证授权的效果。

四、总结

本文详细介绍了如何在Spring Boot应用程序中实现JWT Token认证授权。我们首先了解了JWT的基本概念和组成。然后,我们学习了如何使用Spring Boot和JWT库来实现认证和授权,并通过一个具体示例展示了如何在Spring Boot中创建和验证JWT Token。
通过本文,我们应该已经掌握了如何在Spring Boot中使用JWT Token进行认证授权。我们学会了如何配置JWT,如何创建和验证JWT Token,以及如何通过过滤器来验证请求中的Token。此外,我们还创建了一个认证接口来处理用户登录请求,并生成了JWT Token。
希望本文能够帮助您在开发Spring Boot应用程序时更加得心应手。如果您有任何疑问或建议,请随时留言交流。

  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JWT(JSON Web Token)是一种用于在不同系统之间安全地传递信息的标准。使用JWT进行认证授权通常涉及以下步骤: 1.用户向应用程序发送其凭据(例如用户名和密码)。 2.应用程序使用这些凭据进行身份验证并生成JWT。 3.应用程序将JWT作为响应发送回客户端。 4.客户端将JWT保存在本地(通常是在浏览器的localStorage中)。 5.客户端向应用程序发送请求,该请求包括JWT作为Authorization标头的一部分。 6.应用程序使用JWT来验证请求的有效性。如果JWT有效,则请求被授权。 以下是一个使用Node.js实现JWT认证授权的示例: ```javascript const express = require('express'); const jwt = require('jsonwebtoken'); const app = express(); // 登录路由 app.post('/login', (req, res) => { // 获取用户凭据 const { username, password } = req.body; // 在这里进行身份验证 // 创建JWT const token = jwt.sign({ username }, 'secret_key'); // 将JWT发送回客户端 res.json({ token }); }); // 受保护的路由 app.get('/protected', (req, res) => { // 获取Authorization标头 const authHeader = req.headers.authorization; // 如果该标头不存在或不是Bearer格式,则返回401 Unauthorized if (!authHeader || !authHeader.startsWith('Bearer ')) { return res.status(401).json({ error: 'Unauthorized' }); } // 从JWT中提取用户名 const token = authHeader.split(' ')[1]; const { username } = jwt.verify(token, 'secret_key'); // 在这里进行授权检查 // 如果通过授权检查,则返回200 OK res.send('You are authorized!'); }); app.listen(3000, () => { console.log('Server started on http://localhost:3000'); }); ``` 在上面的示例中,我们使用jsonwebtoken库来创建和验证JWT。在登录路由中,我们使用jwt.sign()方法创建JWT。在受保护的路由中,我们使用jwt.verify()方法来验证JWT,以确保其有效,并从中提取用户名以进行授权检查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值