当前位置: 首页 > wzjs >正文

网站做下载wordpress企业网站推广方法

网站做下载wordpress,企业网站推广方法,家居网站建设 百度文库,免费手机端网站模板下载安装[Java实战]Spring Boot 3整合JWT实现无状态身份认证(二十四) 一、JWT简介与核心概念 1. JWT是什么? JSON Web Token (JWT) 是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。JWT由三部分组成&am…

[Java实战]Spring Boot 3整合JWT实现无状态身份认证(二十四)

一、JWT简介与核心概念

1. JWT是什么?

JSON Web Token (JWT) 是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。JWT由三部分组成:

  • Header:描述令牌类型和签名算法(如HS256、RS256)。
  • Payload:包含用户身份信息(如用户ID、角色)和其他声明(如过期时间)。
  • Signature:对前两部分的签名,确保令牌未被篡改。

2. 为什么要用JWT?

  • 无状态:服务端无需存储会话信息,适合分布式系统。
  • 跨域支持:可通过HTTP头部轻松传递,适用于前后端分离架构。
  • 安全性:基于签名验证,防止数据篡改。

二、环境准备

1. 创建Spring Boot 3.4.5项目

通过 Spring Initializr 创建项目,选择以下依赖:

  • Spring Web
  • Spring Security
  • Lombok(简化代码)
    在这里插入图片描述

2. 添加JWT依赖

pom.xml 中添加 jjwt 库:

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.12.3</version>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.12.3</version><scope>runtime</scope>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>0.12.3</version><scope>runtime</scope>
</dependency>

三、核心代码实现

1. JWT工具类

/*** JwtUtils - 类功能描述** @author csdn:曼岛_* @version 1.0* @date 2025/5/14 15:00* @since openJDK 17*/
@Component
public class JwtUtils {// 密钥(示例,实际应使用安全随机生成并妥善存储)private static final SecretKey SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);private static final long EXPIRATION_TIME = 86400000; // 24小时(毫秒)// 生成JWT令牌public String generateToken(UserDetails userDetails) {Map<String, Object> claims = new HashMap<>();return Jwts.builder().claims(claims).subject(userDetails.getUsername()).issuedAt(new Date()).expiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)).signWith(SECRET_KEY).compact();}// 解析用户名public String extractUsername(String token) {return extractClaim(token, Claims::getSubject);}// 验证令牌有效性public boolean validateToken(String token, UserDetails userDetails) {final String username = extractUsername(token);return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));}// 检查令牌是否过期private boolean isTokenExpired(String token) {return extractExpiration(token).before(new Date());}// 提取过期时间(新增方法)private Date extractExpiration(String token) {return extractClaim(token, Claims::getExpiration);}// 提取声明private <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {final Claims claims = extractAllClaims(token);return claimsResolver.apply(claims);}// 解析全部声明private Claims extractAllClaims(String token) {return Jwts.parser().verifyWith(SECRET_KEY).build().parseSignedClaims(token).getPayload();}// 从请求头获取令牌public String getTokenFromRequest(HttpServletRequest request) {String bearerToken = request.getHeader("Authorization");if (bearerToken != null && bearerToken.startsWith("Bearer ")) {return bearerToken.substring(7);}return null;}
}

四、集成Spring Security

1. 配置Spring Security

@Configuration
@EnableWebSecurity
public class SecurityConfig {private final JwtAuthFilter jwtAuthFilter;public SecurityConfig(JwtAuthFilter jwtAuthFilter) {this.jwtAuthFilter = jwtAuthFilter;}@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.csrf(AbstractHttpConfigurer::disable).authorizeHttpRequests(auth -> auth.requestMatchers("/api/auth/**").permitAll().anyRequest().authenticated()).sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)).addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);return http.build();}@Beanpublic PasswordEncoder passwordEncoder() {return NoOpPasswordEncoder.getInstance(); // 临时使用 NoOpPasswordEncoder// return new BCryptPasswordEncoder();  //生产环境这样用}@Beanpublic AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {return config.getAuthenticationManager();}
}

2. 实现JWT认证过滤器

/*** JwtAuthFilter - 类功能描述** @author csdn:曼岛_* @version 1.0* @date 2025/5/14 15:04* @since openJDK 17*/
@Component
public class JwtAuthFilter extends OncePerRequestFilter {private final JwtUtils jwtUtils;private final CustomUserDetailsService userDetailsService;public JwtAuthFilter(JwtUtils jwtUtils, UserDetailsService userDetailsService) {this.jwtUtils = jwtUtils;this.userDetailsService = (CustomUserDetailsService) userDetailsService;}@Overrideprotected void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain filterChain) throws IOException, ServletException {String token = jwtUtils.getTokenFromRequest(request);if (token != null) {String username = jwtUtils.extractUsername(token);UserDetails userDetails = userDetailsService.loadUserByUsername(username);UsernamePasswordAuthenticationToken authentication =new UsernamePasswordAuthenticationToken(userDetails,null,userDetails.getAuthorities());SecurityContextHolder.getContext().setAuthentication(authentication);}filterChain.doFilter(request, response);}
}

五、创建认证接口

1. 用户登录请求DTO

public record LoginRequest(String username, String password) {}

2. 认证控制器

/*** AuthController - 类功能描述** @author csdn:曼岛_* @version 1.0* @date 2025/5/14 15:07* @since openJDK 17*/
@RestController
@RequestMapping("/api/auth")
public class AuthController {private final AuthenticationManager authenticationManager;private final JwtUtils jwtUtils;public AuthController(AuthenticationManager authenticationManager,JwtUtils jwtUtils) {this.authenticationManager = authenticationManager;this.jwtUtils = jwtUtils;}@PostMapping("/login")public ResponseEntity<String> login(@RequestBody LoginRequest request) {String username = request.username();String password = request.password();System.out.println("=====username====="+username);System.out.println("=====password====="+password);Authentication authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(request.username(),request.password()));// 设置安全上下文SecurityContextHolder.getContext().setAuthentication(authentication);// 从 Authentication 对象中提取 UserDetailsUserDetails userDetails = (UserDetails) authentication.getPrincipal();// 生成 JWT 令牌String token = jwtUtils.generateToken(userDetails);return ResponseEntity.ok(token);}
}

六、测试验证

1. 登录获取Token

curl -X POST http://localhost:8080/api/auth/login \-H "Content-Type: application/json" \-d '{"username":"user","password":"password"}'

在这里插入图片描述
在这里插入图片描述

2. 访问受保护接口

curl http://localhost:8080/api/protected \-H "Authorization: Bearer <your-jwt-token>"

七、常见问题与解决方案

1. SignatureException: JWT signature does not match

  • 原因:密钥不匹配或令牌被篡改。
  • 解决:确保服务端密钥一致且安全存储。

2. ExpiredJwtException

  • 原因:令牌已过期。
  • 解决:重新登录获取新令牌,或实现令牌刷新机制。

3. Spring Security配置不生效

  • 检查点:确保 @EnableWebSecurity 注解已添加,过滤器链配置正确。

八、总结

通过本文,已完成以下关键步骤:

  1. 集成 jjwt 库实现JWT生成与解析。
  2. 配置Spring Security实现无状态认证。
  3. 创建登录接口颁发JWT令牌。
  4. 通过过滤器验证请求中的JWT令牌。

扩展建议

  • 添加角色权限控制(@PreAuthorize)。
  • 实现令牌刷新机制。
  • 使用HTTPS增强传输安全性。

如果你在使用过程中遇到任何问题,欢迎在评论区留言交流。感谢你的阅读,希望这篇文章对你有所帮助!


文章转载自:

http://tfE6XGkz.mrfjr.cn
http://lTybv1H6.mrfjr.cn
http://XMeqZ3q9.mrfjr.cn
http://9xnhK0r1.mrfjr.cn
http://Ra8OARos.mrfjr.cn
http://hmR5v9th.mrfjr.cn
http://2cODklqs.mrfjr.cn
http://pgdKAJsR.mrfjr.cn
http://nP4cXZU5.mrfjr.cn
http://qfm4MA6s.mrfjr.cn
http://n7rY9eYP.mrfjr.cn
http://gHrduXum.mrfjr.cn
http://z9NIpflL.mrfjr.cn
http://uBnvlQBP.mrfjr.cn
http://gnlXnDoA.mrfjr.cn
http://00qBgQAj.mrfjr.cn
http://KpII47Or.mrfjr.cn
http://OS65RKfP.mrfjr.cn
http://GMO98s32.mrfjr.cn
http://XzVI1e2A.mrfjr.cn
http://Ci9rYlHg.mrfjr.cn
http://XESSsczm.mrfjr.cn
http://aT1d576w.mrfjr.cn
http://pyeeQPlk.mrfjr.cn
http://uP1Muuwa.mrfjr.cn
http://tQaYhzxK.mrfjr.cn
http://fUD5tSy4.mrfjr.cn
http://6oafl504.mrfjr.cn
http://f5XY8eAb.mrfjr.cn
http://ZDk4UeDj.mrfjr.cn
http://www.dtcms.com/wzjs/631691.html

相关文章:

  • 网站大全app下载网上交易网
  • 做企业网站 需要注意的广西医科大学网站建设
  • 搭建网站做淘宝客郑州定制网页设计
  • wordpress浏览郑州seo优化服务
  • 珠海网站建站模板中信建设有限责任公司内部网站
  • 设计网站公司 生活湖南岚鸿流程网站
  • 服装公司网站模版云原神官方网站正版下载
  • 网站的备案流程图关于网站建设申请
  • 17.zwd一起做网站池尾站深圳公司网站建设设计
  • 设计师常用网站门户自己做网站成本
  • 福州网站建设哪家强网站推销怎么做ppt模板
  • 郑州网站制作汉狮信用体系建设网站维运工作制度
  • 湖南省水利水电建设工程学校网站wordpress gif 点击播放
  • 自适应网站模板公司阿里巴巴网站推广方式
  • 网站的实现怎么写c#网站开发视频教程 高清
  • 汉滨网站建设四平网站建设哪家效果好
  • 直播网站制作中国室内设计联盟邀请码
  • 中国建设银行网站查行号wordpress主题怎么汉化
  • 网站做好了如何发布海南建设工程股份有限公司网站
  • 广州市品牌网站建设平台wordpress英文主题变中文版
  • 班级建设网站设计方案妙趣网 通辽网站建设
  • 菏泽网的网站建设的联系方式青岛做网站推广公司哪家好
  • 网站设置路由器软件开发工程师是程序员吗
  • wordpress可视化建站梅州企业网站
  • 赣州91人才网官网百度小程序seo
  • 网上做外贸都有哪些网站浏览器下载安装2023最新版
  • 网站建站分辨率西安企业门户网站建设
  • 门户网站是什么网站空间到期了怎么办
  • 河北大良网站建设专业做seo推广
  • 口碑好的企业网站开发网站建站程序