From 49023d2237c8a0c097f807a624727f90c8a36545 Mon Sep 17 00:00:00 2001 From: Sambo Chea Date: Mon, 5 Dec 2022 21:31:54 +0700 Subject: [PATCH] Completed upgrade to spring boot 3.x --- .gitmodules | 8 ++++ cubetiq-security-core | 1 + cubetiq-security-web | 1 + dgs-graphql/build.gradle.kts | 2 +- .../graphql/demo/GraphqlDemoApplication.kt | 11 ++++- .../graphql/demo/config/WebSecurityConfig.kt | 48 +++++++++++-------- .../graphql/demo/domain/AbstractEntity.kt | 4 +- .../graphql/demo/domain/account/Account.kt | 2 +- .../domain/account/AccountEntityListener.kt | 6 +-- .../cubetiqs/graphql/demo/domain/user/User.kt | 2 +- .../demo/domain/user/UserEntityListener.kt | 4 +- .../mutation/LoginMutationResolver.kt | 9 ++-- .../resolver/mutation/UserMutationResolver.kt | 4 +- .../graphql/demo/security/AuthDetails.kt | 5 +- .../src/main/resources/schema/user.graphql | 3 +- settings.gradle.kts | 3 +- 16 files changed, 71 insertions(+), 42 deletions(-) create mode 100644 .gitmodules create mode 160000 cubetiq-security-core create mode 160000 cubetiq-security-web diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..c8361da --- /dev/null +++ b/.gitmodules @@ -0,0 +1,8 @@ +[submodule "cubetiq-security-core"] + path = cubetiq-security-core + url = https://git.cubetiqs.com/cubetiq/cubetiq-security-core.git + branch = main +[submodule "cubetiq-security-web"] + path = cubetiq-security-web + url = https://git.cubetiqs.com/cubetiq/cubetiq-security-web.git + branch = main diff --git a/cubetiq-security-core b/cubetiq-security-core new file mode 160000 index 0000000..612bafe --- /dev/null +++ b/cubetiq-security-core @@ -0,0 +1 @@ +Subproject commit 612bafe9af476798a40a536c82112c63c8627f4f diff --git a/cubetiq-security-web b/cubetiq-security-web new file mode 160000 index 0000000..62d0e71 --- /dev/null +++ b/cubetiq-security-web @@ -0,0 +1 @@ +Subproject commit 62d0e718e59af79db15871bde67affd8c38b15e5 diff --git a/dgs-graphql/build.gradle.kts b/dgs-graphql/build.gradle.kts index 1a58352..1d0b0de 100644 --- a/dgs-graphql/build.gradle.kts +++ b/dgs-graphql/build.gradle.kts @@ -8,7 +8,7 @@ plugins { } dependencies { - api(project(":cubetiq-security-jwt")) + api(project(":cubetiq-security-web")) implementation(platform("com.netflix.graphql.dgs:graphql-dgs-platform-dependencies:5.4.3")) implementation("com.netflix.graphql.dgs:graphql-dgs-spring-boot-starter") diff --git a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/GraphqlDemoApplication.kt b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/GraphqlDemoApplication.kt index 2036987..6df0ef9 100644 --- a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/GraphqlDemoApplication.kt +++ b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/GraphqlDemoApplication.kt @@ -1,10 +1,19 @@ package com.cubetiqs.graphql.demo +import com.cubetiqs.sp.security.util.PasswordUtils +import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication +import org.springframework.security.crypto.password.PasswordEncoder @SpringBootApplication -class GraphqlDemoApplication +class GraphqlDemoApplication @Autowired constructor( + private val passwordEncoder: PasswordEncoder, +) { + init { + PasswordUtils.setEncoder(passwordEncoder) + } +} fun main(args: Array) { runApplication(*args) diff --git a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/config/WebSecurityConfig.kt b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/config/WebSecurityConfig.kt index 10fb1fe..eadf783 100644 --- a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/config/WebSecurityConfig.kt +++ b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/config/WebSecurityConfig.kt @@ -1,38 +1,44 @@ package com.cubetiqs.graphql.demo.config import com.cubetiqs.graphql.demo.security.AuthService -import com.cubetiqs.security.jwt.AuthenticationExceptionEntryPoint -import com.cubetiqs.security.jwt.JwtSecurityConfigurer +import com.cubetiqs.sp.security.EnableCubetiqSecurityModule +import com.cubetiqs.sp.security.jwt.CubetiqJwtProperties +import com.cubetiqs.sp.security.jwt.JwtSecurityConfigurer +import com.cubetiqs.sp.security.support.AuthenticationExceptionEntryPoint import org.springframework.beans.factory.annotation.Autowired +import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter -import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer import org.springframework.security.config.http.SessionCreationPolicy +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder +import org.springframework.security.crypto.password.PasswordEncoder +import org.springframework.security.web.SecurityFilterChain @Configuration @EnableWebSecurity -@EnableGlobalMethodSecurity(prePostEnabled = true) -class WebSecurityConfig : WebSecurityConfigurerAdapter() { - @Autowired - private lateinit var authService: AuthService +@EnableMethodSecurity(prePostEnabled = true) +@EnableCubetiqSecurityModule +class WebSecurityConfig @Autowired constructor( + private val authService: AuthService, + private val cubetiqJwtProperties: CubetiqJwtProperties, +) { + @Bean + fun passwordEncoder(): PasswordEncoder { + return BCryptPasswordEncoder(10) + } - override fun configure(http: HttpSecurity) { - http.csrf().disable() - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + @Bean + fun filterChain(http: HttpSecurity): SecurityFilterChain { + http.csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) - http - .exceptionHandling() - .authenticationEntryPoint(AuthenticationExceptionEntryPoint()) + http.exceptionHandling().authenticationEntryPoint(AuthenticationExceptionEntryPoint()) - http - .apply(JwtSecurityConfigurer(authService)) + http.apply(JwtSecurityConfigurer(authService, cubetiqJwtProperties)) - http - .authorizeRequests() - .anyRequest().permitAll() + http.authorizeHttpRequests().anyRequest().permitAll() + + return http.build() } } \ No newline at end of file diff --git a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/AbstractEntity.kt b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/AbstractEntity.kt index 2e437f5..5313e8e 100644 --- a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/AbstractEntity.kt +++ b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/AbstractEntity.kt @@ -2,8 +2,8 @@ package com.cubetiqs.graphql.demo.domain import org.springframework.data.jpa.domain.support.AuditingEntityListener import java.io.Serializable -import javax.persistence.EntityListeners -import javax.persistence.MappedSuperclass +import jakarta.persistence.EntityListeners +import jakarta.persistence.MappedSuperclass @MappedSuperclass @EntityListeners(AuditingEntityListener::class) diff --git a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/account/Account.kt b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/account/Account.kt index ad73039..7ce8d9e 100644 --- a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/account/Account.kt +++ b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/account/Account.kt @@ -8,7 +8,7 @@ import org.springframework.data.annotation.CreatedDate import org.springframework.data.annotation.LastModifiedDate import java.math.BigDecimal import java.util.* -import javax.persistence.* +import jakarta.persistence.* @Entity @Table(name = "accounts", indexes = [ diff --git a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/account/AccountEntityListener.kt b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/account/AccountEntityListener.kt index 89b82af..f28e6d7 100644 --- a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/account/AccountEntityListener.kt +++ b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/account/AccountEntityListener.kt @@ -1,9 +1,9 @@ package com.cubetiqs.graphql.demo.domain.account import java.util.* -import javax.persistence.PostPersist -import javax.persistence.PrePersist -import javax.persistence.PreUpdate +import jakarta.persistence.PostPersist +import jakarta.persistence.PrePersist +import jakarta.persistence.PreUpdate class AccountEntityListener { @PrePersist diff --git a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/user/User.kt b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/user/User.kt index dd74a9c..4f194f6 100644 --- a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/user/User.kt +++ b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/user/User.kt @@ -7,7 +7,7 @@ import org.hibernate.Hibernate import org.springframework.data.annotation.CreatedDate import org.springframework.data.annotation.LastModifiedDate import java.util.* -import javax.persistence.* +import jakarta.persistence.* @Entity @Table( diff --git a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/user/UserEntityListener.kt b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/user/UserEntityListener.kt index b68ebbe..ca633fa 100644 --- a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/user/UserEntityListener.kt +++ b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/domain/user/UserEntityListener.kt @@ -1,8 +1,8 @@ package com.cubetiqs.graphql.demo.domain.user import java.util.* -import javax.persistence.PrePersist -import javax.persistence.PreUpdate +import jakarta.persistence.PrePersist +import jakarta.persistence.PreUpdate class UserEntityListener { @PrePersist diff --git a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/resolver/mutation/LoginMutationResolver.kt b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/resolver/mutation/LoginMutationResolver.kt index b3411c3..5753b30 100644 --- a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/resolver/mutation/LoginMutationResolver.kt +++ b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/resolver/mutation/LoginMutationResolver.kt @@ -4,7 +4,7 @@ import com.cubetiqs.graphql.demo.context.GMutation import com.cubetiqs.graphql.demo.dgmodel.DgsConstants import com.cubetiqs.graphql.demo.dgmodel.types.LoginResponse import com.cubetiqs.graphql.demo.security.AuthService -import com.cubetiqs.security.jwt.util.JwtUtils +import com.cubetiqs.sp.security.jwt.util.JwtTokenUtils import com.netflix.graphql.dgs.DgsMutation import org.springframework.beans.factory.annotation.Autowired @@ -16,7 +16,10 @@ class LoginMutationResolver { @DgsMutation(field = DgsConstants.MUTATION.Login) fun login(username: String, password: String): LoginResponse { val auth = authService.login(username, password) - val token = JwtUtils.encryptToken(auth) - return LoginResponse(token) + val token = JwtTokenUtils.createTokens(auth) + return LoginResponse( + accessToken = token.accessToken, + refreshToken = token.refreshToken, + ) } } \ No newline at end of file diff --git a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/resolver/mutation/UserMutationResolver.kt b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/resolver/mutation/UserMutationResolver.kt index 131bfb6..9212b38 100644 --- a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/resolver/mutation/UserMutationResolver.kt +++ b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/resolver/mutation/UserMutationResolver.kt @@ -7,7 +7,7 @@ import com.cubetiqs.graphql.demo.domain.user.User import com.cubetiqs.graphql.demo.domain.user.UserInput import com.cubetiqs.graphql.demo.domain.user.UserMapper import com.cubetiqs.graphql.demo.repository.UserRepository -import com.cubetiqs.security.jwt.util.JwtUtils +import com.cubetiqs.sp.security.util.PasswordUtils import com.netflix.graphql.dgs.DgsMutation import com.netflix.graphql.dgs.exceptions.DgsEntityNotFoundException import org.springframework.beans.factory.annotation.Autowired @@ -30,7 +30,7 @@ class UserMutationResolver @Autowired constructor( @DgsMutation(field = DgsConstants.MUTATION.ChangeUserPassword) fun changePassword(input: UserChangePasswordInput): User { val user = userRepository.queryByUsername(input.username).orElse(null) ?: throw DgsEntityNotFoundException("User not found!") - user.password = JwtUtils.passwordEncoder().encode(input.password) + user.password = PasswordUtils.encode(input.password) return userRepository.save(user) } } \ No newline at end of file diff --git a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/security/AuthDetails.kt b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/security/AuthDetails.kt index 2f13bd2..0f6f44b 100644 --- a/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/security/AuthDetails.kt +++ b/dgs-graphql/src/main/kotlin/com/cubetiqs/graphql/demo/security/AuthDetails.kt @@ -1,7 +1,8 @@ package com.cubetiqs.graphql.demo.security import com.cubetiqs.graphql.demo.domain.user.User -import com.cubetiqs.security.jwt.util.JwtUtils +import com.cubetiqs.sp.security.jwt.util.JwtTokenUtils +import com.cubetiqs.sp.security.util.PasswordUtils import org.springframework.security.core.GrantedAuthority import org.springframework.security.core.authority.SimpleGrantedAuthority import org.springframework.security.core.userdetails.UserDetails @@ -47,7 +48,7 @@ data class AuthDetails( } fun isPasswordValid(password: String): Boolean { - return JwtUtils.passwordEncoder().matches(password, this.getPassword()) + return PasswordUtils.matches(password, this.getPassword()) } companion object { diff --git a/dgs-graphql/src/main/resources/schema/user.graphql b/dgs-graphql/src/main/resources/schema/user.graphql index f565bae..95cbde7 100644 --- a/dgs-graphql/src/main/resources/schema/user.graphql +++ b/dgs-graphql/src/main/resources/schema/user.graphql @@ -14,7 +14,8 @@ input UserInput { } type LoginResponse { - token: String + accessToken: String + refreshToken: String } input UserChangePasswordInput { diff --git a/settings.gradle.kts b/settings.gradle.kts index 0205eff..d68ffb5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,3 @@ rootProject.name = "spring-graphql-demo" -include("dgs-graphql") -include("cubetiq-security-jwt") \ No newline at end of file +include("cubetiq-security-core", "cubetiq-security-web", "dgs-graphql")