mirror of
https://github.com/Frooodle/Stirling-PDF.git
synced 2025-11-01 01:21:18 +01:00
This PR introduces JWT (JSON Web Token) authentication for Stirling-PDF,
allowing for stateless authentication capabilities alongside the
existing session-based authentication system.
### Key Features & Changes
JWT Authentication System
- Core Service: JwtService.java - Token generation, validation, and
cookie management
- Authentication Filter: JwtAuthenticationFilter.java - Request
interceptor for JWT validation
- Key Management: KeyPersistenceService.java +
KeyPairCleanupService.java - RSA key rotation and persistence
- Frontend: jwt-init.js - Client-side JWT handling and URL cleanup
Security Integration
- SAML2: JwtSaml2AuthenticationRequestRepository.java - JWT-backed SAML
request storage
- OAuth2: Updated CustomAuthenticationSuccessHandler. java,
CustomOAuth2AuthenticationSuccessHandler.java &
CustomSaml2AuthenticationSuccessHandler.java for JWT integration
- Configuration: Enhanced SecurityConfiguration.java with JWT filter
chain
Infrastructure
- Caching: CacheConfig.java - Caffeine cache for JWT keys
- Database: New JwtVerificationKey.java entity for key storage
- Error Handling: JwtAuthenticationEntryPoint.java for unauthorized
access
### Challenges Encountered
- Configured SecurityConfiguration to use either
`UsernamePasswordAuthenticationFilter` or `JWTAuthenticationFilter`
based on whether JWTs are enabled to prevent the former intercepting
requests while in stateless mode.
- Removed the `.defaultSuccessUrl("/")` from login configuration as its
inclusion was preventing overriding the use of the
`CustomAuthenticationSuccessHandler` and preventing proper
authentication flows.
---
## Checklist
### General
- [x] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [x] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md)
(if applicable)
- [x] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md)
(if applicable)
- [x] I have performed a self-review of my own code
- [x] My changes generate no new warnings
### Documentation
- [x] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [x] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)
### UI Changes (if applicable)
- [x] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)
<img width="599" height="515" alt="Screenshot 2025-07-10 at 13 35 56"
src="https://github.com/user-attachments/assets/4126b752-ad0d-4ffa-b295-6714c43381e1"
/>
<img width="392" height="376" alt="Screenshot 2025-07-10 at 13 36 10"
src="https://github.com/user-attachments/assets/c681bc43-68ff-4934-8245-d544e2ad7b9c"
/>
<img width="1870" height="986" alt="eb750e8c3954fc47b2dd2e6e76ddb7d5"
src="https://github.com/user-attachments/assets/fca9b23d-b0b6-4884-8a26-98a441b641ef"
/>
<img width="1299" height="702" alt="Screenshot 2025-07-10 at 13 30 57"
src="https://github.com/user-attachments/assets/9415d8bf-fac4-4d38-8c3a-985d043d1076"
/>
### Testing (if applicable)
- [x] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md#6-testing)
for more details.
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ludy <Ludy87@users.noreply.github.com>
Co-authored-by: EthanHealy01 <80844253+EthanHealy01@users.noreply.github.com>
Co-authored-by: Ethan <ethan@MacBook-Pro.local>
Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
76 lines
2.7 KiB
Groovy
76 lines
2.7 KiB
Groovy
repositories {
|
|
maven { url = "https://build.shibboleth.net/maven/releases" }
|
|
}
|
|
|
|
ext {
|
|
jwtVersion = '0.12.6'
|
|
}
|
|
|
|
bootRun {
|
|
enabled = false
|
|
}
|
|
|
|
spotless {
|
|
java {
|
|
target 'src/**/java/**/*.java'
|
|
googleJavaFormat(googleJavaFormatVersion).aosp().reorderImports(false)
|
|
|
|
importOrder("java", "javax", "org", "com", "net", "io", "jakarta", "lombok", "me", "stirling")
|
|
toggleOffOn()
|
|
trimTrailingWhitespace()
|
|
leadingTabsToSpaces()
|
|
endWithNewline()
|
|
}
|
|
yaml {
|
|
target '**/*.yml', '**/*.yaml'
|
|
trimTrailingWhitespace()
|
|
leadingTabsToSpaces()
|
|
endWithNewline()
|
|
}
|
|
format 'gradle', {
|
|
target '**/gradle/*.gradle', '**/*.gradle'
|
|
trimTrailingWhitespace()
|
|
leadingTabsToSpaces()
|
|
endWithNewline()
|
|
}
|
|
}
|
|
dependencies {
|
|
implementation project(':common')
|
|
|
|
api 'org.springframework:spring-jdbc'
|
|
api 'org.springframework:spring-webmvc'
|
|
api 'org.springframework.session:spring-session-core'
|
|
api "org.springframework.security:spring-security-core:$springSecuritySamlVersion"
|
|
api "org.springframework.security:spring-security-saml2-service-provider:$springSecuritySamlVersion"
|
|
api 'org.springframework.boot:spring-boot-starter-jetty'
|
|
api 'org.springframework.boot:spring-boot-starter-security'
|
|
api 'org.springframework.boot:spring-boot-starter-data-jpa'
|
|
api 'org.springframework.boot:spring-boot-starter-oauth2-client'
|
|
api 'org.springframework.boot:spring-boot-starter-mail'
|
|
api 'org.springframework.boot:spring-boot-starter-cache'
|
|
api 'com.github.ben-manes.caffeine:caffeine'
|
|
api 'io.swagger.core.v3:swagger-core-jakarta:2.2.35'
|
|
implementation 'com.bucket4j:bucket4j_jdk17-core:8.14.0'
|
|
|
|
// https://mvnrepository.com/artifact/com.bucket4j/bucket4j_jdk17
|
|
implementation 'org.bouncycastle:bcprov-jdk18on:1.81'
|
|
|
|
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.1.3.RELEASE'
|
|
api 'io.micrometer:micrometer-registry-prometheus'
|
|
implementation 'com.unboundid.product.scim2:scim2-sdk-client:4.0.0'
|
|
|
|
api "io.jsonwebtoken:jjwt-api:$jwtVersion"
|
|
runtimeOnly "io.jsonwebtoken:jjwt-impl:$jwtVersion"
|
|
runtimeOnly "io.jsonwebtoken:jjwt-jackson:$jwtVersion"
|
|
runtimeOnly 'com.h2database:h2:2.3.232' // Don't upgrade h2database
|
|
runtimeOnly 'org.postgresql:postgresql:42.7.7'
|
|
constraints {
|
|
implementation "org.opensaml:opensaml-core:$openSamlVersion"
|
|
implementation "org.opensaml:opensaml-saml-api:$openSamlVersion"
|
|
implementation "org.opensaml:opensaml-saml-impl:$openSamlVersion"
|
|
}
|
|
implementation 'com.coveo:saml-client:5.0.0'
|
|
}
|
|
|
|
tasks.register('prepareKotlinBuildScriptModel') {}
|