jwt配置

文章介绍了如何在SpringBoot项目中集成JWT进行身份验证。首先,在pom文件中添加JWT的相关依赖。然后,创建JwtTests测试类,展示JWT的创建、校验和解析过程。接着,创建User实体类和JWT工具类,用于处理用户登录和生成、验证JWTtoken。最后,提供了一个UserController控制层示例,演示了登录和检查token的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.在pom添加jwt依赖

<!-- JWT依赖 -->
 <dependency>
 <groupId>io.jsonwebtoken</groupId>
 <artifactId>jjwt</artifactId>
 <version>0.9.1</version>
 </dependency>
 <!-- JWT相关依赖,jdk1.8以上版本还需引⼊以下依赖 -->
 <dependency>
 <groupId>javax.xml.bind</groupId>
 <artifactId>jaxb-api</artifactId>
 <version>2.3.1</version>
 </dependency>
 <dependency>
 <groupId>com.sun.xml.bind</groupId>
 <artifactId>jaxb-impl</artifactId>
 <version>3.0.2</version>
 </dependency>
 <dependency>
 <groupId>com.sun.xml.bind</groupId>
 <artifactId>jaxb-core</artifactId>
 <version>3.0.2</version>
 </dependency>
 <dependency>
 <groupId>javax.activation</groupId>
 <artifactId>activation</artifactId>
 <version>1.1.1</version>
 </dependency>

二.创建JwtTests测试类,演示JWT的基本使⽤

package com.ytx.springboot_jwt.test;
import io.jsonwebtoken.*;
import org.junit.Test;
import java.util.Date;
import java.util.UUID;
public class JwtTests {
 private long time = 1000 * 60 * 60 * 1;
 private String signature = "admin";
 // 创建JWT
 @Test
 public void createJwt() {
 JwtBuilder jwtBuilder = Jwts.builder();
 String jwtToken = jwtBuilder
 // Header
 .setHeaderParam("typ", "JWT")
 .setHeaderParam("alg", "HS256")
 // Payload
 .claim("username", "tom")
 .claim("role", "admin")
 .setSubject("admin-test")
 .setExpiration(new Date(System.currentTimeMillis() + time)) // 过期时间
 .setId(UUID.randomUUID().toString())
 // Signature
 .signWith(SignatureAlgorithm.HS256, signature) // 设置加密算法和密钥
 // 使⽤"."符号连接
 .compact();
 System.out.println(jwtToken);
 }
 // 校验JWT
 @Test
 public void checkJwt() {
 String token =
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1Y
iI6ImFkbWluLXRlc3QiLCJleHAiOjE2ODY5NTk1NjAsImp0aSI6ImZhMDMzMGVhLTc0YTMtNGI4My1hNmZiLTg1
MjA0ZGE2NDMyMCJ9.a0WKFt2rU-SVvWTrk_fqjDX_-Z6YLnxjVjD05oXajk4";
 boolean result = Jwts.parser().isSigned(token);
 System.out.println(result);
 }
 // 解析JWT
 @Test
 public void parseJwt() {
 String token =
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1Y
iI6ImFkbWluLXRlc3QiLCJleHAiOjE2ODY5NTk1NjAsImp0aSI6ImZhMDMzMGVhLTc0YTMtNGI4My1hNmZiLTg1
MjA0ZGE2NDMyMCJ9.a0WKFt2rU-SVvWTrk_fqjDX_-Z6YLnxjVjD05oXajk4";
 JwtParser jwtParser = Jwts.parser();
 Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
 Claims claims = claimsJws.getBody();
 System.out.println(claims.get("username"));
 System.out.println(claims.get("role"));
 System.out.println(claims.getId());
 System.out.println(claims.getSubject());
 System.out.println(claims.getExpiration());
 }
}

2.2 SpringBoot+JWT

1.com.ytx.springboot_jwt.domain包下创建User实体类。
package com.ytx.springboot_jwt.domain;
import lombok.Data;
@Data
public class User {
 private String username;
 private String password;
 private String token;
}
2.com.ytx.springboot_jwt.utils包下创建JWT⼯具类。
package com.example.demo.config;
import io.jsonwebtoken.*;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Date;
import java.util.UUID;
 
public class JwtUtil {
 private static final long time = 1000 * 60 * 60 * 1*10;
// private static final long time = 1000 * 10;//存活时间
 private static final String signature = "admin";//签名
 
 //生成token
 public  void createToken() {
  //创建一个jwt对象
 JwtBuilder jwtBuilder = Jwts.builder();
 //jwtoken ->abc.def.xyz
 String jwtToken = jwtBuilder
// Header
 .setHeaderParam("typ", "JWT")
 .setHeaderParam("alg", "HS256")  //指定算法是HS256
 // Payload   载荷
 .claim("username", "tom")
 .claim("role", "admin")
.setSubject("admin-test") //设置名称信息
 .setExpiration(new Date(System.currentTimeMillis() + time))//设置过期时间
 .setId(UUID.randomUUID().toString())//设置Id字段
 // Signature  签名
 .signWith(SignatureAlgorithm.HS256, signature)//设置加密算法和签名
 // 使⽤"."符号连接
 .compact();
  System.out.println(jwtToken);

 }
 //判断token是否正确或者过时
 
 public static boolean BooleanToken(String token) {
  boolean signed = Jwts.parser().isSigned(token);
  return  signed;
 }

 //获取用户的数据
 public static boolean checkToken(String token) {
  //判断token是否为空
 if (token == null || token == "") {
 return false;
 }
 try {
  //将Jwt转化为key-value,通过key获取值
 Jws<Claims> claimsJws = Jwts.parser().setSigningKey(signature).parseClaimsJws(token);
  Claims body = claimsJws.getBody();//存储的是用户保存的数据 载荷  body
  System.out.println(body.getId());  //获取ID
  System.out.println(body.get("username"));  //获取到Username
  System.out.println(body.get("role"));//获取到role
  System.out.println(body.getExpiration()); //获取到期时间
 } catch (Exception e) {
 e.printStackTrace();
 return false;
 }
 return true;
 }
}
3.com.ytx.springboot_jwt.controller包下创建UserController控制层类。
package com.ytx.springboot_jwt.controller;
import com.ytx.springboot_jwt.domain.User;
import com.ytx.springboot_jwt.utils.JwtUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
 @GetMapping("login")
 public User login(User user) {
 String username = "tom";
 String password = "123456";
 if (username.equals(user.getUsername()) && password.equals(password)) {
 // 添加Token
 user.setToken(JwtUtil.createToken());
 return user;
 }
 return null;
 }
 /*
 @GetMapping("check_token")
 public boolean checkToken(HttpServletRequest request) {
 String token = request.getHeader("token");
 return JwtUtil.checkToken(token);
 }
 */
 @GetMapping("check_token")
 public boolean checkToken(String token) {
 return JwtUtil.checkToken(token);
 }
}

<think>好的,我现在需要帮助用户了解如何在Django项目中配置和使用JWT进行身份验证。根据用户提供的引用内容,我需要整理出一个清晰的步骤指南。 首先,用户提到了几个引用,其中引用了配置settings.py的部分,包括INSTALLED_APPS中添加rest_framework和rest_framework_jwt,还有JWT_AUTH的相关设置,比如过期时间和认证类。引用3和4都提到了这些配置项,我需要确保这些步骤被正确涵盖。 接下来,用户可能需要安装必要的库,比如djangorestframework和djangorestframework-jwt。根据引用中的信息,安装步骤应该是第一步,这样后续的配置才能生效。 然后是关于用户模型的设置,用户可能已经有一个自定义的User模型,需要在AUTH_USER_MODEL中指定。这一点在引用4中提到,需要提醒用户确认他们的用户模型是否正确配置。 生成和验证Token的部分,引用1和2提到了创建API视图来生成Token,以及如何在请求中使用Token进行认证。这里需要给出示例代码,比如创建登录视图,使用obtain_jwt_token,以及如何保护API端点。 测试部分,用户可能需要知道如何用curl或Postman来测试Token的获取和使用,比如在请求头中添加Authorization字段。这部分需要简明地说明,方便用户验证配置是否成功。 最后,注意事项比如HTTPS的使用、Token过期时间和刷新机制,这些在引用2和5中都有提及,应该作为最佳实践提醒用户。 需要确保回答结构清晰,分步骤说明,并引用正确的来源。同时,生成的相关问题要围绕JWT配置的深入问题,比如性能分析、优化方法和应用场景,但根据用户提供的引用,可能更适合的问题是关于自定义Token负载、刷新机制和安全措施等。</think>### 如何在Django中设置和使用JWT进行身份验证 #### 1. 安装依赖库 首先安装必要的Python包: ```bash pip install djangorestframework djangorestframework-jwt ``` #### 2. 配置Django设置(`settings.py`) 在项目的`settings.py`中添加以下配置: ```python INSTALLED_APPS = [ ... 'rest_framework', # 启用Django REST框架 'rest_framework_jwt', # 集成JWT认证 ] # 配置DRF的认证类 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # 优先使用JWT认证 'rest_framework.authentication.SessionAuthentication', # 保留Session认证 ), } # 设置JWT参数 import datetime JWT_AUTH = { 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), # Token有效期(默认7天) 'JWT_AUTH_HEADER_PREFIX': 'Bearer', # 请求头中的Token前缀 'JWT_ALLOW_REFRESH': True, # 允许刷新Token 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7), # 刷新Token有效期 } # 若使用自定义用户模型 AUTH_USER_MODEL = 'your_app.User' # 替换为实际应用名和模型名 ``` 此配置启用JWT作为主要认证方式,并定义Token过期时间等关键参数[^3][^4][^5]。 #### 3. 创建用户认证API 在`views.py`中创建登录接口: ```python from rest_framework_jwt.views import obtain_jwt_token from rest_framework.decorators import api_view @api_view(['POST']) def login(request): return obtain_jwt_token(request) # 调用内置视图生成Token ``` 在`urls.py`中配置路由: ```python from django.urls import path from .views import login urlpatterns = [ path('api/login/', login, name='login'), ] ``` #### 4. 保护API端点 在需要认证的视图中添加权限控制: ```python from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import IsAuthenticated @api_view(['GET']) @permission_classes([IsAuthenticated]) def protected_data(request): return Response({"data": "敏感信息"}) ``` #### 5. 测试JWT流程 1. **获取Token**: ```bash curl -X POST http://localhost:8000/api/login/ -d 'username=admin&password=123' ``` 返回示例:`{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}` 2. **访问受保护API**: ```bash curl -H "Authorization: Bearer eyJhbGci..." http://localhost:8000/api/protected/ ``` #### 关键机制说明 - **Token生成**:基于用户凭证(用户名/密码)生成包含用户ID、过期时间的签名令牌[^1] - **无状态验证**:服务端通过验证签名和过期时间判断合法性,无需存储会话[^5] - **安全传输**:必须通过HTTPS传输以防止Token泄露[^2] #### 注意事项 1. **自定义Token负载**:可通过`JWT_PAYLOAD_HANDLER`添加用户角色等额外信息 2. **刷新机制**:使用`/api-token-refresh/`端点更新即将过期的Token 3. **黑名单管理**:需额外插件(如`django-rest-framework-jwt-blacklist`)实现主动注销
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值