Java中的授权与认证:Spring Security和JWT

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Java中的授权与认证:完整指南及示例



在现代Web开发中,应用程序安全是核心方面之一。在Java生态系统中,有几种经过验证的工具可用于实现认证(验证用户身份)和授权(验证访问权限)。本文将详细解析可帮助您保护应用程序的库和方法。



基本概念

在介绍工具之前,有必要区分两个概念:

  • 认证 — 验证用户是否为其所声称的身份的过程(例如,登录名和密码)。
  • 授权 — 确定经过认证的用户可以访问哪些资源或执行哪些操作。


Spring Security — 行业标准

Spring Security 是一个强大的框架,用于Java应用程序(尤其是与Spring Boot结合使用时)的安全性保障。它提供了现成的机制,支持通过表单、HTTP Basic、OAuth2、LDAP等多种方式进行认证。

主要功能:

  • 灵活配置安全过滤器链。
  • 支持会话和JWT令牌。
  • 防范CSRF攻击、XSS、点击劫持。
  • 与数据库集成以存储用户信息。


使用JWT的Spring Security基本配置示例:

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.http.SessionCreationPolicy;import org.springframework.security.web.SecurityFilterChain;

@Configuration@EnableWebSecuritypublic class SecurityConfig {

@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeHttpRequests(authz -> authz .requestMatchers("/api/auth/**").permitAll() .anyRequest().authenticated() ) .addFilterBefore(new JwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); return http.build(); }}


JWT(JSON Web Token)— 无缝授权

JWT 是一种紧凑且自包含的方式,用于在各方之间以JSON格式传输数据。在Java中,通常使用库 io.jsonwebtoken:jjwt 来处理JWT。

工作原理:

  1. 用户发送登录名/密码。
  2. 服务器验证数据并返回JWT令牌。
  3. 客户端存储令牌(例如,在localStorage中)并在请求头 Authorization: Bearer <token> 中发送。
  4. 服务器验证令牌签名并提取数据(角色、标识符)。


Java中生成JWT的示例:

import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import io.jsonwebtoken.security.Keys;import java.security.Key;import java.util.Date;

public class JwtUtil { private static final Key SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);

public static String generateToken(String username, String role) { return Jwts.builder() .setSubject(username) .claim("role", role) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1小时 .signWith(SECRET_KEY) .compact(); }}


OAuth2和Spring

推荐