mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2025-08-22 12:19:24 +00: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') {}
|