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.

Editor Integration​

Use this command from your editor:

  • Neovim: Not yet available in haft.nvim (CLI only)
  • VS Code: Coming soon (preview →)
  • IntelliJ IDEA: Coming soon (preview →)

See Also​