Synthèse automatique
Fournit des modèles d’implémentation pour l’authentification et l’autorisation JWT dans les applications Spring Boot 3.5.x avec Spring Security 6.x et JJWT.
Points forts
- Couvre le flux complet sans état : jetons d’accès et de rafraîchissement, stratégies Bearer et cookie HttpOnly, révocation.
- Détaille le contrôle d’accès RBAC/ABAC au niveau méthode avec @PreAuthorize et un PermissionEvaluator personnalisé.
- Donne des tableaux concrets de dépendances, de propriétés et de configuration pour JJWT 0.12.6 et Spring Security 6.x.
- Explique l’intégration avec Spring Data JPA et les fournisseurs OAuth2.
Limites
- Suppose Spring Boot 3.5.x, Spring Security 6.x et JJWT 0.12.6 ; ne s’applique pas aux piles plus anciennes.
- Fournit des modèles et extraits de code, mais pas d’application complète exécutable ni de suite de tests.
- Certaines valeurs par défaut sensibles (cookie-secure à false, secret de secours) exigent un durcissement manuel en production.
À utiliser pour ajouter une connexion JWT, le rafraîchissement de jetons ou des contrôles de rôles et permissions à une API REST Spring Boot ou à un backend de SPA.
À éviter pour les piles non Spring ou lorsqu’un fournisseur d’identité managé gère déjà l’intégralité du flux d’authentification.
Analyse de sécurité
SûrThe skill is purely instructional documentation for Spring Security/JJWT; it declares Bash but only in the context of typical build/test usage, and contains no download-and-execute commands, obfuscated payloads, filesystem destruction, or credential exfiltration. The only notable issues are insecure-by-default configuration samples (fallback JWT secret, non-secure cookie), which are code-quality/security-posture nits rather than agent execution risk.
- •application.yml sample uses a hardcoded fallback secret `${JWT_SECRET:change-me-min-32-chars-in-production}`, which can silently reach production with a known key
- •sample sets `cookie-secure: false` by default (commented 'true in production'), an insecure default if copied verbatim
Exemples
Implement JWT authentication in my Spring Boot 3.5 app: add the JJWT dependencies, create an access token and refresh token service, and expose /api/auth/login and /api/auth/refresh endpoints.Configure a Spring Security 6.x SecurityFilterChain for stateless Bearer token authentication and protect admin endpoints with @PreAuthorize("hasRole('ADMIN')") and permission checks.Switch my Spring Boot JWT authentication from Bearer headers to HttpOnly secure cookies for a React SPA, including logout and token revocation.name: spring-boot-security-jwt description: Provides JWT authentication and authorization patterns for Spring Boot 3.5.x covering token generation with JJWT, Bearer/cookie authentication, database/OAuth2 integration, and RBAC/permission-based access control using Spring Security 6.x. Use when implementing authentication or authorization in Spring Boot applications. allowed-tools: Read, Write, Edit, Bash, Glob, Grep
Spring Boot JWT Security
JWT authentication and authorization patterns for Spring Boot 3.5.x using Spring Security 6.x and JJWT. Covers token generation, validation, refresh strategies, RBAC/ABAC, and OAuth2 integration.
Overview
This skill provides implementation patterns for stateless JWT authentication in Spring Boot applications. It covers the complete authentication flow including token generation with JJWT 0.12.6, Bearer/cookie-based authentication, refresh token rotation, and method-level authorization with @PreAuthorize expressions.
Key capabilities:
- Access and refresh token generation with configurable expiration
- Bearer token and HttpOnly cookie authentication strategies
- Integration with Spring Data JPA and OAuth2 providers
- RBAC with role/permission-based
@PreAuthorizerules - Token revocation and blacklisting for logout/rotation
When to Use
Activate when user requests involve:
- "Implement JWT authentication", "secure REST API with tokens"
- "Spring Security 6.x configuration", "SecurityFilterChain setup"
- "Role-based access control", "RBAC",
`@PreAuthorize` - "Refresh token", "token rotation", "token revocation"
- "OAuth2 integration", "social login", "Google/GitHub auth"
- "Stateless authentication", "SPA backend security"
- "JWT filter", "OncePerRequestFilter", "Bearer token"
- "Cookie-based JWT", "HttpOnly cookie"
- "Permission-based access control", "custom PermissionEvaluator"
Quick Reference
Dependencies (JJWT 0.12.6)
| Artifact | Scope |
|----------|-------|
| spring-boot-starter-security | compile |
| spring-boot-starter-oauth2-resource-server | compile |
| io.jsonwebtoken:jjwt-api:0.12.6 | compile |
| io.jsonwebtoken:jjwt-impl:0.12.6 | runtime |
| io.jsonwebtoken:jjwt-jackson:0.12.6 | runtime |
| spring-security-test | test |
See references/jwt-quick-reference.md for Maven and Gradle snippets.
Key Configuration Properties
| Property | Example Value | Notes |
|----------|--------------|-------|
| jwt.secret | ${JWT_SECRET} | Min 256 bits, never hardcode |
| jwt.access-token-expiration | 900000 | 15 min in milliseconds |
| jwt.refresh-token-expiration | 604800000 | 7 days in milliseconds |
| jwt.issuer | my-app | Validated on every token |
| jwt.cookie-name | jwt-token | For cookie-based auth |
| jwt.cookie-http-only | true | Always true in production |
| jwt.cookie-secure | true | Always true with HTTPS |
Authorization Annotations
| Annotation | Example |
|-----------|---------|
| @PreAuthorize("hasRole('ADMIN')") | Role check |
| @PreAuthorize("hasAuthority('USER_READ')") | Permission check |
| @PreAuthorize("hasPermission(#id, 'Doc', 'READ')") | Domain object check |
| @PreAuthorize("@myService.canAccess(#id)") | Spring bean check |
Instructions
Step 1 — Add Dependencies
Include spring-boot-starter-security, spring-boot-starter-oauth2-resource-server, and the three JJWT artifacts in your build file. See references/jwt-quick-reference.md for exact Maven/Gradle snippets.
Step 2 — Configure application.yml
jwt:
secret: ${JWT_SECRET:change-me-min-32-chars-in-production}
access-token-expiration: 900000
refresh-token-expiration: 604800000
issuer: my-app
cookie-name: jwt-token
cookie-http-only: true
cookie-secure: false # true in production
See references/jwt-complete-configuration.md for the full properties reference.
Step 3 — Implement JwtService
Core operations: generate access token, generate refresh token, extract username, validate token.
@Service
public class JwtService {
public String generateAccessToken(UserDetails userDetails) {
return Jwts.builder()
.subject(userDetails.getUsername())
.issuer(issuer)
.issuedAt(new Date())
.expiration(new Date(System.currentTimeMillis() + accessTokenExpiration))
.claim("authorities", getAuthorities(userDetails))
.signWith(getSigningKey())
.compact();
}
public boolean isTokenValid(String token, UserDetails userDetails) {
try {
String username = extractUsername(token);
return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
} catch (JwtException e) {
return false;
}
}
}
See references/jwt-complete-configuration.md for the complete JwtService including key management and claim extraction.
Step 4 — Create JwtAuthenticationFilter
Extend OncePerRequestFilter to extract a JWT from the Authorization: Bearer header (or HttpOnly cookie), validate it, and set the SecurityContext.
@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
String authHeader = request.getHeader("Authorization");
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
chain.doFilter(request, response);
return;
}
String jwt = authHeader.substring(7);
String username = jwtService.extractUsername(jwt);
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
if (jwtService.isTokenValid(jwt, userDetails)) {
UsernamePasswordAuthenticationToken authToken =
new UsernamePasswordAuthenticationToken(
userDetails, null, userDetails.getAuthorities());
authToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authToken);
}
}
chain.doFilter(request, response);
}
}
See references/configuration.md for the cookie-based variant.
Step 5 — Configure SecurityFilterChain
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.csrf(AbstractHttpConfigurer::disable)
.sessionManagement(s -> s.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/auth/**", "/swagger-ui/**").permitAll()
.anyRequest().authenticated()
)
.authenticationProvider(authenticationProvider)
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}
}
See references/jwt-complete-configuration.md for CORS, logout handler, and OAuth2 login integration.
Step 6 — Create Authentication Endpoints
Expose /register, /authenticate, /refresh, and /logout via @RestController. Return accessToken + refreshToken in the response body (and optionally set an HttpOnly cookie).
See references/examples.md for the complete AuthenticationController and AuthenticationService.
Step 7 — Implement Refresh Token Strategy
Store refresh tokens in the database with user_id, expiry_date, revoked, and expired columns. On /refresh, verify the stored token, revoke it, and issue a new pair (token rotation).
See references/token-management.md for RefreshToken entity, rotation logic, and Redis-based blacklisting.
Step 8 — Add Authorization Rules
Use @EnableMethodSecurity and @PreAuthorize annotations for fine-grained control:
@PreAuthorize("hasRole('ADMIN')")
public Page<UserResponse> getAllUsers(Pageable pageable) { ... }
@PreAuthorize("hasPermission(#documentId, 'Document', 'READ')")
public Document getDocument(Long documentId) { ... }
See references/authorization-patterns.md for RBAC entity model, PermissionEvaluator, and ABAC patterns.
Step 9 — Write Security Tests
@SpringBootTest
@AutoConfigureMockMvc
class AuthControllerTest {
@Test
void shouldDenyAccessWithoutToken() throws Exception {
mockMvc.perform(get("/api/orders"))
.andExpect(status().isUnauthorized());
}
@Test
@WithMockUser(roles = "ADMIN")
void shouldAllowAdminAccess() throws Exception {
mockMvc.perform(get("/api/admin/users"))
.andExpect(status().isOk());
}
}
See references/testing.md and references/jwt-testing-guide.md for full test suites, Testcontainers setup, and a security test checklist.
Best Practices
Token Security
- Use minimum 256-bit secret keys — load from environment variables, never hardcode
- Set short access token lifetimes (15 min); use refresh tokens for longer sessions
- Implement token rotation: revoke old refresh token when issuing a new one
- Use
jti(JWT ID) claim for blacklisting on logout
Cookie vs Bearer Header
- Prefer HttpOnly cookies for browser clients (XSS-safe)
- Use
Authorization: Bearerheader for mobile/API clients - Set
Secure,SameSite=LaxorStricton cookies in production
Spring Security 6.x
- Use
SecurityFilterChainbean — never extendWebSecurityConfigurerAdapter - Disable CSRF only for stateless APIs; keep it enabled for session-based flows
- Use
@EnableMethodSecurityinstead of deprecated@EnableGlobalMethodSecurity - Validate
issandaudclaims; reject tokens from untrusted issuers
Performance
- Cache
UserDetailswith@Cacheableto avoid DB lookup on every request - Cache signing key derivation (avoid re-computing HMAC key per request)
- Use Redis for refresh token storage at scale
What NOT to Do
- Do not store sensitive data (passwords, PII) in JWT claims — claims are only signed, not encrypted
- Do not issue tokens with infinite lifetime
- Do not accept tokens without validating signature and expiration
- Do not share signing keys across environments
Examples
Basic Authentication Flow
@RestController
@RequestMapping("/api/auth")
@RequiredArgsConstructor
public class AuthController {
private final AuthService authService;
@PostMapping("/authenticate")
public ResponseEntity<AuthResponse> authenticate(
@RequestBody LoginRequest request) {
return ResponseEntity.ok(authService.authenticate(request));
}
@PostMapping("/refresh")
public ResponseEntity<AuthResponse> refresh(@RequestBody RefreshRequest request) {
return ResponseEntity.ok(authService.refreshToken(request.refreshToken()));
}
@PostMapping("/logout")
public ResponseEntity<Void> logout() {
authService.logout();
return ResponseEntity.ok().build();
}
}
JWT Authorization on Controller Method
@RestController
@RequestMapping("/api/admin")
@PreAuthorize("hasRole('ADMIN')")
public class AdminController {
@GetMapping("/users")
public ResponseEntity<List<UserResponse>> getAllUsers() {
return ResponseEntity.ok(adminService.getAllUsers());
}
}
See references/examples.md for complete entity models and service implementations.
References
| File | Content | |------|---------| | references/jwt-quick-reference.md | Dependencies, minimal service, common patterns | | references/jwt-complete-configuration.md | Full config: properties, SecurityFilterChain, JwtService, OAuth2 RS | | references/configuration.md | JWT config beans, CORS, CSRF, error handling, session options | | references/examples.md | Complete application setup: controllers, services, entities | | references/authorization-patterns.md | RBAC/ABAC entity model, PermissionEvaluator, SpEL expressions | | references/token-management.md | Refresh token entity, rotation, blacklisting with Redis | | references/testing.md | Unit and MockMvc tests, test utilities | | references/jwt-testing-guide.md | Testcontainers, load testing, security test checklist | | references/security-hardening.md | Security headers, HSTS, rate limiting, audit logging | | references/performance-optimization.md | Caffeine cache config, async validation, connection pooling | | references/oauth2-integration.md | Google/GitHub OAuth2 login, OAuth2UserService | | references/microservices-security.md | Inter-service JWT propagation, resource server config | | references/migration-spring-security-6x.md | Migration from Spring Security 5.x | | references/troubleshooting.md | Common errors, debugging tips |
Constraints and Warnings
Security Constraints
- JWT tokens are signed but not encrypted — do not include sensitive data in claims
- Always validate
exp,iss, andaudclaims before trusting the token - Signing keys must be at least 256 bits; never use weak keys in production
- Load secrets from environment variables or secure vaults, never from config files
- SameSite cookie attribute is essential for CSRF protection in cookie-based flows
Spring Security 6.x Constraints
WebSecurityConfigurerAdapteris removed — useSecurityFilterChainbeans only@EnableGlobalMethodSecurityis deprecated — use@EnableMethodSecurity- Lambda DSL is required for
HttpSecurityconfiguration (no method chaining) WebSecurityConfigurerAdapter.order()replaced by@Orderon@Configurationclasses
Token Constraints
- Access tokens should expire in 5-15 minutes for security
- Refresh tokens should be stored server-side (DB or Redis), never in localStorage
- Implement token blacklisting for immediate revocation on logout
jticlaim is required for token blacklisting to work correctly
Related Skills
spring-boot-dependency-injection— Constructor injection patterns used throughoutspring-boot-rest-api-standards— REST API security patterns and error handlingunit-test-security-authorization— Testing Spring Security configurationsspring-data-jpa— User entity and repository patternsspring-boot-actuator— Security monitoring and health endpoints
Du fichier au premier essai
Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.
Consulter la source et ses fichiers annexesCe téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.
1. Télécharger le fichier
Télécharger SKILL.mdDepuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/spring-boot-jwt-security-mryiqhn9/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.
Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.
mkdir -p '.skill-downloads/spring-boot-jwt-security-mryiqhn9' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/spring-boot-jwt-security-mryiqhn9/download' --output '.skill-downloads/spring-boot-jwt-security-mryiqhn9/SKILL.md.part' && mv '.skill-downloads/spring-boot-jwt-security-mryiqhn9/SKILL.md.part' '.skill-downloads/spring-boot-jwt-security-mryiqhn9/SKILL.md'2. Vérifier les prérequis
Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.
Outils déclarés par l’auteur (à vérifier dans votre agent) : Read, Write, Edit, Bash, Glob, Grep
Extrait original : Quick Reference
Dependencies (JJWT 0.12.6)
| Artifact | Scope |
|---|---|
spring-boot-starter-security | compile |
spring-boot-starter-oauth2-resource-server | compile |
io.jsonwebtoken:jjwt-api:0.12.6 | compile |
io.jsonwebtoken:jjwt-impl:0.12.6 | runtime |
io.jsonwebtoken:jjwt-jackson:0.12.6 | runtime |
spring-security-test | test |
See references/jwt-quick-reference.md for Maven and Gradle snippets.
Key Configuration Properties
| Property | Example Value | Notes |
|---|---|---|
jwt.secret | ${JWT_SECRET} | Min 256 bits, never hardcode |
jwt.access-token-expiration | 900000 | 15 min in milliseconds |
jwt.refresh-token-expiration | 604800000 | 7 days in milliseconds |
jwt.issuer | my-app | Validated on every token |
jwt.cookie-name | jwt-token | For cookie-based auth |
jwt.cookie-http-only | true | Always true in production |
jwt.cookie-secure | true | Always true with HTTPS |
Authorization Annotations
| Annotation | Example |
|---|---|
@PreAuthorize("hasRole('ADMIN')") | Role check |
@PreAuthorize("hasAuthority('USER_READ')") | Permission check |
@PreAuthorize("hasPermission(#id, 'Doc', 'READ')") | Domain object check |
@PreAuthorize("@myService.canAccess(#id)") | Spring bean check |
Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.
3. Charger la skill
Après vérification, copiez le dossier complet dans le projet avec l’une des commandes ci-dessous, puis ouvrez une nouvelle session de l’outil. La commande s’arrête si un dossier du même nom existe déjà : comparez les fichiers avant de le remplacer.
Claude Code
test -f '.skill-downloads/spring-boot-jwt-security-mryiqhn9/SKILL.md' && test -s '.skill-downloads/spring-boot-jwt-security-mryiqhn9/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/spring-boot-security-jwt' && cp -R '.skill-downloads/spring-boot-jwt-security-mryiqhn9' '.claude/skills/spring-boot-security-jwt'OpenSkills
OpenSkills doit déjà être installé. La procédure locale install/read est contrôlée avec OpenSkills 1.5.0, qui exige Node.js ≥ 20.6.0. Aucun slug du catalogue n’est résolu automatiquement.
Installation officielle d’OpenSkillsopenskills install './.skill-downloads/spring-boot-jwt-security-mryiqhn9'openskills read 'spring-boot-jwt-security-mryiqhn9'La lecture doit afficher le contenu du fichier installé et son dossier de base. Elle ne lance ni la skill ni ses dépendances.
Pour un agent qui lit AGENTS.md, synchronisez ensuite l’index. Cette commande modifie AGENTS.md : relisez le diff avant de l’utiliser.
openskills syncMode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.
4. Faire un premier essai
Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :
Lis .skill-downloads/spring-boot-jwt-security-mryiqhn9/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.
Sécurité AMM DeFi
Securite
Checklist de sécurité pour les contrats Solidity AMM, pools de liquidité et flux de swap. Couvre réentrance, attaques par donation, manipulation d'oracles, etc.
Créateur de règles Semgrep
Securite
Crée des règles Semgrep personnalisées pour détecter des vulnérabilités de sécurité, des motifs de bugs et des motifs de code. Inclut une méthodologie de test en premier, le support du mode taint et des étapes de validation. Utile pour construire des détections d'analyse statique ciblées.
Revue barre d'outils développement
Securite
Règles de sécurité pour la barre d'outils de développement, le client PostHog et les feature flags. À utiliser lors de la revue de modifications des composants dev-tools et connexes.