Skip to main content

haft generate security

Generate Spring Security configuration with support for JWT, Session-based, and OAuth2 authentication.

Usage

haft generate security [flags]
haft g sec [flags] # alias
haft g auth [flags] # alias

Overview

The security generator creates a complete, production-ready security setup for your Spring Boot application. It supports three authentication types:

TypeDescriptionUse Case
JWTStateless token-based authenticationREST APIs, microservices, SPAs
SessionTraditional session-based with form loginServer-rendered web apps, MVC
OAuth2Social login (Google, GitHub, Facebook)Apps with third-party authentication

Flags

FlagShortDescription
--jwtGenerate JWT authentication
--sessionGenerate session-based authentication
--oauth2Generate OAuth2 authentication
--allGenerate all authentication types
--package-pOverride base package
--no-interactiveSkip interactive wizard
--skip-entitiesSkip User/Role entity generation
--refreshForce re-scan project profile
--jsonOutput result as JSON

Examples

# Interactive mode - select authentication types via TUI
haft generate security

# Generate JWT authentication only
haft generate security --jwt

# Generate session-based authentication
haft generate security --session

# Generate OAuth2 (Google, GitHub, Facebook)
haft generate security --oauth2

# Generate all authentication types
haft generate security --all

# Non-interactive with specific package
haft generate security --jwt --package com.example.app --no-interactive

# Skip User/Role entity generation (use existing)
haft generate security --jwt --skip-entities

JWT Authentication

Generates stateless token-based authentication suitable for REST APIs and SPAs.

Generated Files

FileDescription
SecurityConfig.javaSpring Security configuration with JWT filter chain
JwtUtil.javaJWT token generation, validation, and extraction
JwtAuthenticationFilter.javaRequest filter for token validation
AuthenticationController.javaLogin, register, and refresh token endpoints
AuthRequest.javaLogin request DTO
AuthResponse.javaToken response DTO
RegisterRequest.javaRegistration request DTO
RefreshTokenRequest.javaRefresh token request DTO
CustomUserDetailsService.javaLoads users from database
User.javaUser entity (optional)
Role.javaRole entity (optional)
UserRepository.javaUser repository (optional)
RoleRepository.javaRole repository (optional)

API Endpoints

MethodEndpointDescription
POST/api/auth/registerRegister new user
POST/api/auth/loginLogin and get tokens
POST/api/auth/refreshRefresh access token

Configuration

Add to application.properties or application.yml:

# JWT Configuration
jwt:
secret: your-256-bit-secret-key-here
expiration: 86400000 # 24 hours in milliseconds
refresh-expiration: 604800000 # 7 days in milliseconds

Example Usage

# Register a user
curl -X POST http://localhost:8080/api/auth/register \
-H "Content-Type: application/json" \
-d '{"username": "john", "email": "john@example.com", "password": "secret123"}'

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

# Access protected resource
curl http://localhost:8080/api/users \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9..."

# Refresh token
curl -X POST http://localhost:8080/api/auth/refresh \
-H "Content-Type: application/json" \
-d '{"refreshToken": "eyJhbGciOiJIUzI1NiJ9..."}'

Required Dependencies

The generator automatically checks and offers to add:

DependencyPurpose
spring-boot-starter-securitySpring Security core
spring-boot-starter-data-jpaDatabase access
jjwt-api (0.12.6)JWT API
jjwt-impl (0.12.6)JWT implementation
jjwt-jackson (0.12.6)JWT JSON support

Session-Based Authentication

Generates traditional form-based authentication suitable for server-rendered web applications.

Generated Files

FileDescription
SecurityConfig.javaSpring Security with form login, remember-me, session management
CustomUserDetailsService.javaLoads users from database
AuthController.javaMVC controller for login/register pages
RegisterRequest.javaRegistration form DTO

Features

  • Form-based login (/login)
  • Remember-me functionality
  • Session fixation protection
  • CSRF protection
  • Logout handling

Configuration

# Session Configuration
server:
servlet:
session:
timeout: 30m
cookie:
http-only: true
secure: true # Enable in production

spring:
security:
remember-me:
key: your-remember-me-key
token-validity-seconds: 604800 # 7 days

Example Routes

RouteDescription
/loginLogin page
/registerRegistration page
/logoutLogout (POST)
/dashboardProtected page (example)

OAuth2 Authentication

Generates social login configuration supporting Google, GitHub, and Facebook.

Generated Files

FileDescription
SecurityConfig.javaOAuth2 login configuration
OAuth2UserService.javaCustom OAuth2 user handling
OAuth2SuccessHandler.javaPost-login success handler
OAuth2UserPrincipal.javaOAuth2User implementation

Supported Providers

ProviderRegistration ID
Googlegoogle
GitHubgithub
Facebookfacebook

Configuration

Add to application.yml:

spring:
security:
oauth2:
client:
registration:
google:
client-id: your-google-client-id
client-secret: your-google-client-secret
scope:
- email
- profile
github:
client-id: your-github-client-id
client-secret: your-github-client-secret
scope:
- user:email
- read:user
facebook:
client-id: your-facebook-client-id
client-secret: your-facebook-client-secret
scope:
- email
- public_profile

OAuth2 Flow

  1. User clicks "Login with Google/GitHub/Facebook"
  2. Redirected to provider's authorization page
  3. User grants permissions
  4. Redirected back with authorization code
  5. OAuth2UserService processes user info
  6. OAuth2SuccessHandler handles post-login logic (create/update user, generate JWT, etc.)

Required Dependencies

DependencyPurpose
spring-boot-starter-securitySpring Security core
spring-boot-starter-oauth2-clientOAuth2 client support

Intelligent Features

Dependency Checking

The generator automatically:

  1. Scans your pom.xml or build.gradle for existing dependencies
  2. Identifies missing required dependencies
  3. Prompts to add them automatically
  4. Uses your project's build tool (Maven/Gradle)
? Missing dependencies detected:
- spring-boot-starter-security
- jjwt-api
- jjwt-impl
- jjwt-jackson

Add missing dependencies? [Y/n]

User Entity Detection

Before generating User/Role entities, Haft scans your project for existing user-related entities:

Scanned DirectoriesEntity Names Checked
entity/User, AppUser, Account
model/Member, Principal
domain/UserEntity, ApplicationUser
user/
auth/

If found, the generator:

  • Skips entity generation
  • Uses your existing entity in generated code
  • Prompts if you want to generate anyway

Architecture-Aware Generation

Files are placed according to your project's architecture:

ArchitecturePackage Location
Layeredcom.example.security
Featurecom.example.auth or com.example.security
Hexagonalcom.example.infrastructure.security
Cleancom.example.infrastructure.security
Modularcom.example.security

Multiple Authentication Types

You can generate multiple authentication types in the same project:

# Generate JWT for API + OAuth2 for web
haft generate security --jwt --oauth2

# Generate all types
haft generate security --all

When generating multiple types:

  • Shared files (like SecurityConfig.java) are merged appropriately
  • Duplicate files are skipped with a warning
  • Each type's specific files are generated

Next Steps After Generation

JWT Authentication

  1. Add jwt.secret to application.properties/yml
  2. Configure jwt.expiration (default: 24 hours)
  3. Create initial admin user or use /api/auth/register
  4. Test with /api/auth/login endpoint

Session Authentication

  1. Configure session timeout in application.properties
  2. Create login/register Thymeleaf templates
  3. Add CSRF token to forms
  4. Configure remember-me key

OAuth2 Authentication

  1. Create OAuth apps at provider consoles:
  2. Add client IDs and secrets to application.yml
  3. Configure redirect URIs at providers

File Safety

Haft never overwrites existing files. If a file already exists, it will be skipped:

WARN  File exists, skipping file=SecurityConfig.java

Use --refresh to force re-scan project profile if your project structure has changed.

See Also