From 49e19666b24f0557fad9a8f5e17bc56bbf180f58 Mon Sep 17 00:00:00 2001 From: Hanbin Lee Date: Sat, 8 Apr 2023 00:09:18 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[#41]=20feat:=20=EC=B9=B4=ED=8E=98=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=20api=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 프론트 테스트겸 카페 검색 api 수정(이름 조건 추가) - security 설정 관련 내용 수정(파일 이동) - flyway seed data 내용 수정(image) --- db/seed/R__Insert_Seed_cafe_image.sql | 6 ++++-- .../domain/cafe/repository/CafeRepository.kt | 4 ++++ .../handler/CustomAccessDeniedHandler.kt | 0 .../handler/CustomAuthenticationEntryPoint.kt | 0 .../dongnecafe/common/config/SecurityConfig.kt | 16 +++++++++++++++- .../domain/cafe/controller/CafeController.kt | 3 ++- .../domain/cafe/service/CafeService.kt | 4 ++-- script/migration-local.sh | 4 ++-- 8 files changed, 29 insertions(+), 8 deletions(-) rename {dongne-account-api => dongne-common}/src/main/kotlin/io/beaniejoy/dongnecafe/security/handler/CustomAccessDeniedHandler.kt (100%) rename {dongne-account-api => dongne-common}/src/main/kotlin/io/beaniejoy/dongnecafe/security/handler/CustomAuthenticationEntryPoint.kt (100%) diff --git a/db/seed/R__Insert_Seed_cafe_image.sql b/db/seed/R__Insert_Seed_cafe_image.sql index 72dfa12..dacfc98 100644 --- a/db/seed/R__Insert_Seed_cafe_image.sql +++ b/db/seed/R__Insert_Seed_cafe_image.sql @@ -1,3 +1,5 @@ +DROP PROCEDURE IF EXISTS insertCafeImages; + DELIMITER $$ CREATE PROCEDURE insertCafeImages() BEGIN @@ -15,10 +17,10 @@ BEGIN WHILE(j <= 3) DO INSERT IGNORE INTO `cafe_image` (img_url, created_at, created_by, updated_at, updated_by, cafe_id) - VALUES (CONCAT('test_img_url_', idx_img), now(), 'system', now(), 'system', var_cafe_id); + VALUES (CONCAT('https://d3qy02qh8hbgxp.cloudfront.net/cafe', idx_img, '.jpg'), now(), 'system', now(), 'system', var_cafe_id); SET j = j + 1; - SET idx_img = idx_img + 1; + SET idx_img = idx_img % 7 + 1; END WHILE; SET i = i + 1; diff --git a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepository.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepository.kt index 8cd1bac..0e93771 100644 --- a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepository.kt +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepository.kt @@ -1,8 +1,12 @@ package io.beaniejoy.dongnecafe.domain.cafe.repository import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe +import org.springframework.data.domain.Page +import org.springframework.data.domain.Pageable import org.springframework.data.jpa.repository.JpaRepository interface CafeRepository : JpaRepository { fun findByName(name: String): Cafe? + + fun findByNameContainingIgnoreCase(name: String?, pageable: Pageable): Page } \ No newline at end of file diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/handler/CustomAccessDeniedHandler.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/handler/CustomAccessDeniedHandler.kt similarity index 100% rename from dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/handler/CustomAccessDeniedHandler.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/handler/CustomAccessDeniedHandler.kt diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/handler/CustomAuthenticationEntryPoint.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/handler/CustomAuthenticationEntryPoint.kt similarity index 100% rename from dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/handler/CustomAuthenticationEntryPoint.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/handler/CustomAuthenticationEntryPoint.kt diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt index 0efc2c5..d52e496 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt @@ -2,6 +2,8 @@ package io.beaniejoy.dongnecafe.common.config import io.beaniejoy.dongnecafe.security.JwtAuthenticationConfigurer import io.beaniejoy.dongnecafe.security.JwtTokenUtils +import io.beaniejoy.dongnecafe.security.handler.CustomAccessDeniedHandler +import io.beaniejoy.dongnecafe.security.handler.CustomAuthenticationEntryPoint import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.security.servlet.PathRequest import org.springframework.context.annotation.Bean @@ -18,6 +20,12 @@ class SecurityConfig { @Autowired lateinit var jwtTokenUtils: JwtTokenUtils + @Autowired + lateinit var customAccessDeniedHandler: CustomAccessDeniedHandler + + @Autowired + lateinit var customAuthenticationEntryPoint: CustomAuthenticationEntryPoint + @Bean fun filterChain(http: HttpSecurity): SecurityFilterChain { return http @@ -26,7 +34,8 @@ class SecurityConfig { .formLogin().disable() .authorizeRequests() - .anyRequest().authenticated() +// .anyRequest().authenticated() + .anyRequest().permitAll() .and() .sessionManagement() @@ -34,6 +43,11 @@ class SecurityConfig { .and() .also { jwtAuthenticationConfigurer(it) } + .exceptionHandling() + .authenticationEntryPoint(customAuthenticationEntryPoint) // 인증 예외 entryPoint 적용 + .accessDeniedHandler(customAccessDeniedHandler) // 인가 예외 handler 적용 + + .and() .build() } diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt index 39341e1..c19831a 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt @@ -40,9 +40,10 @@ class CafeController( */ @GetMapping fun searchCafeList( + @RequestParam("name") name: String?, @PageableDefault(sort = ["name"], direction = Sort.Direction.ASC, page = 0, size = 10) pageable: Pageable ): ApplicationResponse> { - val searchCafes = cafeService.searchCafeList(pageable) + val searchCafes = cafeService.searchCafeList(name, pageable) return ApplicationResponse .success() diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt index cc8092c..e6dac01 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt @@ -59,8 +59,8 @@ class CafeService( } } - fun searchCafeList(pageable: Pageable): Page { - val cafeList: Page = cafeRepository.findAll(pageable) + fun searchCafeList(name: String?, pageable: Pageable): Page { + val cafeList: Page = cafeRepository.findByNameContainingIgnoreCase(name, pageable) return cafeList.map { CafeSearchInfo.of(it) } } diff --git a/script/migration-local.sh b/script/migration-local.sh index da668d0..d39d46c 100755 --- a/script/migration-local.sh +++ b/script/migration-local.sh @@ -32,8 +32,8 @@ flyway info -configFiles="$PROJECT_ROOT_DIR/db/$FLYWAY_CONFIG_FILE" printf "\n" echo "2. Flyway Migrate" -flyway migrate -configFiles="$PROJECT_ROOT_DIR/db/$FLYWAY_CONFIG_FILE" +flyway migrate -configFiles="$PROJECT_ROOT_DIR/db/$FLYWAY_CONFIG_FILE" -outputType=json printf "\n" echo "3. Flyway Validate" -flyway validate -configFiles="$PROJECT_ROOT_DIR/db/$FLYWAY_CONFIG_FILE" +flyway validate -configFiles="$PROJECT_ROOT_DIR/db/$FLYWAY_CONFIG_FILE" -outputType=json From ac40f5b42a9c4e65e28e004caca3779180589365 Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Tue, 11 Apr 2023 23:23:10 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[#41]=20feat:=20migration=20local=EC=9A=A9?= =?UTF-8?q?=20shell=20script=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/migration-local.sh | 75 +++++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 27 deletions(-) diff --git a/script/migration-local.sh b/script/migration-local.sh index d39d46c..3bd16f7 100755 --- a/script/migration-local.sh +++ b/script/migration-local.sh @@ -1,39 +1,60 @@ #!/bin/bash -echo -e "########### [LOCAL] DB Migration ###########" -printf "\n" - PROJECT_NAME="dongne-cafe-api" PROJECT_ROOT_DIR=$(pwd) FLYWAY_CONFIG_FILE="flyway-local.conf" -if [[ $PROJECT_ROOT_DIR != *"/$PROJECT_NAME" ]]; -then - echo "Error >> move to project's root directory" - exit 1 -fi +check_project_root_path() { + if [[ $PROJECT_ROOT_DIR != *"/$PROJECT_NAME" ]]; + then + echo "Error >> move to project's root directory" + exit 1 + fi -echo "Project's Root Directory: $PROJECT_ROOT_DIR" -printf "\n" + echo -e "Project's Root Directory: $PROJECT_ROOT_DIR\n" +} -echo "###################################" -echo "Using Flyway Version" +flyway_version_check() { + echo "###################################" + echo "Using Flyway Version" -if ! flyway --version 2> /dev/null; -then - echo "Error >> Flyway Not Supported" - exit 1 -fi -echo "###################################" -printf "\n" + if ! flyway --version 2> /dev/null; + then + echo "Error >> Flyway Not Supported" + exit 1 + fi + echo -e "###################################\n" +} -echo "1. Flyway Info" -flyway info -configFiles="$PROJECT_ROOT_DIR/db/$FLYWAY_CONFIG_FILE" -printf "\n" +error_check() { + if [ $? -ne 0 ]; + then + echo "Error >> $1 & Exit" + exit 1 + fi -echo "2. Flyway Migrate" -flyway migrate -configFiles="$PROJECT_ROOT_DIR/db/$FLYWAY_CONFIG_FILE" -outputType=json -printf "\n" + printf "\n" +} -echo "3. Flyway Validate" -flyway validate -configFiles="$PROJECT_ROOT_DIR/db/$FLYWAY_CONFIG_FILE" -outputType=json +flyway_migration_process() { + STEP_1="1. Flyway Info" + STEP_2="2. Flyway Migrate" + STEP_3="3. Flyway Validate" + + echo $STEP_1 + flyway info -configFiles="$PROJECT_ROOT_DIR/db/$FLYWAY_CONFIG_FILE" + error_check "$STEP_1" + + echo $STEP_2 + flyway migrate -configFiles="$PROJECT_ROOT_DIR/db/$FLYWAY_CONFIG_FILE" -outputType=json + error_check "$STEP_2" + + echo $STEP_3 + flyway validate -configFiles="$PROJECT_ROOT_DIR/db/$FLYWAY_CONFIG_FILE" -outputType=json + error_check "$STEP_3" +} + +echo "########### [LOCAL] DB Migration ###########" +check_project_root_path +flyway_version_check +flyway_migration_process \ No newline at end of file From e95349f743ae730693430b2e0b565a26fe8b2787 Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Wed, 12 Apr 2023 00:49:38 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[#41]=20modify:=20=EC=A0=84=EC=B2=B4?= =?UTF-8?q?=EC=A0=81=EC=9D=B8=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Security 관련 JWT filter, configurer 공통 코드 common 모듈화 - flyway 불필요한 설정 제거 --- .../common/config/SecurityConfig.kt | 2 +- .../dongnecafe/controller/AuthController.kt | 2 +- .../filter/JwtAuthenticationFilter.kt | 52 ------------------- .../src/main/resources/application.yml | 12 ++--- .../common/config/AuditingConfig.kt | 2 +- .../config/JwtAuthenticationConfigurer.kt | 2 +- .../security/constant/SecurityConstant.kt | 2 + .../filter/JwtAuthenticationFilter.kt | 2 +- .../security/{ => utils}/JwtTokenUtils.kt | 16 +++--- .../{ => utils}/SecurityExtensions.kt | 2 +- .../common/config/SecurityConfig.kt | 4 +- .../security/JwtAuthenticationConfigurer.kt | 25 --------- .../src/main/resources/application.yml | 4 +- 13 files changed, 25 insertions(+), 102 deletions(-) delete mode 100644 dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt rename {dongne-account-api => dongne-common}/src/main/kotlin/io/beaniejoy/dongnecafe/security/config/JwtAuthenticationConfigurer.kt (94%) rename {dongne-service-api => dongne-common}/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt (97%) rename dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/{ => utils}/JwtTokenUtils.kt (81%) rename dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/{ => utils}/SecurityExtensions.kt (91%) delete mode 100644 dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/JwtAuthenticationConfigurer.kt diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt index 176a56d..378ca2b 100644 --- a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt @@ -1,6 +1,6 @@ package io.beaniejoy.dongnecafe.common.config -import io.beaniejoy.dongnecafe.security.JwtTokenUtils +import io.beaniejoy.dongnecafe.security.utils.JwtTokenUtils import io.beaniejoy.dongnecafe.security.config.JwtAuthenticationConfigurer import io.beaniejoy.dongnecafe.security.handler.CustomAccessDeniedHandler import io.beaniejoy.dongnecafe.security.handler.CustomAuthenticationEntryPoint diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/controller/AuthController.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/controller/AuthController.kt index a784715..18e6789 100644 --- a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/controller/AuthController.kt +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/controller/AuthController.kt @@ -1,7 +1,7 @@ package io.beaniejoy.dongnecafe.controller import io.beaniejoy.dongnecafe.common.response.ApplicationResponse -import io.beaniejoy.dongnecafe.security.JwtTokenUtils +import io.beaniejoy.dongnecafe.security.utils.JwtTokenUtils import io.beaniejoy.dongnecafe.domain.member.model.request.SignInRequest import io.beaniejoy.dongnecafe.model.TokenResponse import io.beaniejoy.dongnecafe.service.AuthService diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt deleted file mode 100644 index cc933ff..0000000 --- a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt +++ /dev/null @@ -1,52 +0,0 @@ -package io.beaniejoy.dongnecafe.security.filter - -import io.beaniejoy.dongnecafe.security.JwtTokenUtils -import io.beaniejoy.dongnecafe.security.constant.SecurityConstant.BEARER -import io.beaniejoy.dongnecafe.security.constant.SecurityConstant.WHITESPACE -import mu.KotlinLogging -import org.springframework.http.HttpHeaders -import org.springframework.security.core.context.SecurityContextHolder -import org.springframework.web.filter.GenericFilterBean -import javax.servlet.FilterChain -import javax.servlet.ServletRequest -import javax.servlet.ServletResponse -import javax.servlet.http.HttpServletRequest - -class JwtAuthenticationFilter( - private val jwtTokenUtils: JwtTokenUtils -) : GenericFilterBean() { - private val log = KotlinLogging.logger {} - - /** - * JWT access token 인증 처리 - */ - override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) { - val httpRequest = request as HttpServletRequest - log.info { "[JwtAuthenticationFilter][${request.dispatcherType}] uri: ${request.requestURI}" } - - getAccessToken(httpRequest)?.let { - jwtTokenUtils.getAuthentication(it) - }?.also { - SecurityContextHolder.getContext().authentication = it - log.info { "Valid Access Token [${it.name}]" } - } - - chain.doFilter(request, response) - } - - private fun getAccessToken(request: HttpServletRequest): String? { - val bearer = request.getHeader(HttpHeaders.AUTHORIZATION) - ?: return null - - val splitBearer = bearer.split(WHITESPACE) - if (splitBearer.first() != BEARER) { - return null - } - - if (splitBearer.size != 2 || splitBearer.last().isBlank()) { - return null - } - - return splitBearer.last() - } -} \ No newline at end of file diff --git a/dongne-account-api/src/main/resources/application.yml b/dongne-account-api/src/main/resources/application.yml index 438f753..6df4146 100644 --- a/dongne-account-api/src/main/resources/application.yml +++ b/dongne-account-api/src/main/resources/application.yml @@ -1,3 +1,6 @@ +server: + port: 9090 + spring: profiles: active: local @@ -5,22 +8,17 @@ spring: driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: - ddl-auto: none # use flyway migration + ddl-auto: none properties: hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect + dialect: org.hibernate.dialect.MySQL8Dialect format_sql: true show-sql: false open-in-view: - flyway: - enabled: false devtools: livereload: enabled: false # no use devtools' LiveReload Server -server: - port: 9090 - logging: level: org.hibernate.SQL: debug # logger 통해 로깅 diff --git a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/AuditingConfig.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/AuditingConfig.kt index 735deaf..3174200 100644 --- a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/AuditingConfig.kt +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/AuditingConfig.kt @@ -1,6 +1,6 @@ package io.beaniejoy.dongnecafe.common.config -import io.beaniejoy.dongnecafe.security.getAuthPrincipal +import io.beaniejoy.dongnecafe.security.utils.getAuthPrincipal import mu.KLogging import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/config/JwtAuthenticationConfigurer.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/config/JwtAuthenticationConfigurer.kt similarity index 94% rename from dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/config/JwtAuthenticationConfigurer.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/config/JwtAuthenticationConfigurer.kt index 7e4c682..00e6bb5 100644 --- a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/config/JwtAuthenticationConfigurer.kt +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/config/JwtAuthenticationConfigurer.kt @@ -1,7 +1,7 @@ package io.beaniejoy.dongnecafe.security.config -import io.beaniejoy.dongnecafe.security.JwtTokenUtils import io.beaniejoy.dongnecafe.security.filter.JwtAuthenticationFilter +import io.beaniejoy.dongnecafe.security.utils.JwtTokenUtils import org.springframework.security.config.annotation.SecurityConfigurerAdapter import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.web.DefaultSecurityFilterChain diff --git a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/constant/SecurityConstant.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/constant/SecurityConstant.kt index 0d6eb28..9371644 100644 --- a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/constant/SecurityConstant.kt +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/constant/SecurityConstant.kt @@ -6,4 +6,6 @@ object SecurityConstant { const val ANONYMOUS_USER = "anonymousUser" const val ROLE_ANONYMOUS = "ROLE_ANONYMOUS" + + const val JWT_AUTHORITIES_KEY = "authorities" } \ No newline at end of file diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt similarity index 97% rename from dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt index 21757b1..5df9a40 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt @@ -1,6 +1,6 @@ package io.beaniejoy.dongnecafe.security.filter -import io.beaniejoy.dongnecafe.security.JwtTokenUtils +import io.beaniejoy.dongnecafe.security.utils.JwtTokenUtils import io.beaniejoy.dongnecafe.security.constant.SecurityConstant.BEARER import io.beaniejoy.dongnecafe.security.constant.SecurityConstant.WHITESPACE import mu.KotlinLogging diff --git a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/JwtTokenUtils.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/utils/JwtTokenUtils.kt similarity index 81% rename from dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/JwtTokenUtils.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/utils/JwtTokenUtils.kt index 6d6aba4..fb39ae1 100644 --- a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/JwtTokenUtils.kt +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/utils/JwtTokenUtils.kt @@ -1,5 +1,7 @@ -package io.beaniejoy.dongnecafe.security +package io.beaniejoy.dongnecafe.security.utils +import io.beaniejoy.dongnecafe.security.SecurityUser +import io.beaniejoy.dongnecafe.security.constant.SecurityConstant.JWT_AUTHORITIES_KEY import io.jsonwebtoken.Claims import io.jsonwebtoken.ExpiredJwtException import io.jsonwebtoken.Jwts @@ -24,9 +26,7 @@ class JwtTokenUtils( private val key: Key = Keys.hmacShaKeyFor(secretKey.toByteArray()) private val validityTimeMilliSec: Long = validityTimeSec * 1000 - companion object : KLogging() { - const val AUTHORITIES_KEY = "authorities" - } + companion object : KLogging() fun createToken(authentication: Authentication): String { val authenticatedMember = (authentication.principal as SecurityUser).member @@ -37,7 +37,7 @@ class JwtTokenUtils( return Jwts.builder() .setSubject(authenticatedMember.email) - .claim(AUTHORITIES_KEY, authorities) + .claim(JWT_AUTHORITIES_KEY, authorities) .signWith(key, SignatureAlgorithm.HS256) .setExpiration(expirationDate) .compact() @@ -47,7 +47,7 @@ class JwtTokenUtils( val claims = getValidTokenBody(accessToken) ?: return null - val authorities = claims[AUTHORITIES_KEY].toString().split(",") + val authorities = claims[JWT_AUTHORITIES_KEY].toString().split(",") .map { SimpleGrantedAuthority(it) } return UsernamePasswordAuthenticationToken(claims.subject, accessToken, authorities) @@ -62,10 +62,10 @@ class JwtTokenUtils( .parseClaimsJws(accessToken) .body } catch (e: ExpiredJwtException) { - logger.error { "JWT access token expired. > Error: ${e.message}" } + logger.info { "JWT access token expired. > Error: ${e.message}" } null } catch (e: Exception) { - logger.error { "JWT access token invalid. > Error: ${e.message}" } + logger.info { "JWT access token invalid. > Error: ${e.message}" } null } } diff --git a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/SecurityExtensions.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/utils/SecurityExtensions.kt similarity index 91% rename from dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/SecurityExtensions.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/utils/SecurityExtensions.kt index 9b53630..008c912 100644 --- a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/SecurityExtensions.kt +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/utils/SecurityExtensions.kt @@ -1,4 +1,4 @@ -package io.beaniejoy.dongnecafe.security +package io.beaniejoy.dongnecafe.security.utils import io.beaniejoy.dongnecafe.security.constant.SecurityConstant.ANONYMOUS_USER import io.beaniejoy.dongnecafe.security.constant.SecurityConstant.ROLE_ANONYMOUS diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt index d52e496..12ae6fc 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt @@ -1,7 +1,7 @@ package io.beaniejoy.dongnecafe.common.config -import io.beaniejoy.dongnecafe.security.JwtAuthenticationConfigurer -import io.beaniejoy.dongnecafe.security.JwtTokenUtils +import io.beaniejoy.dongnecafe.security.config.JwtAuthenticationConfigurer +import io.beaniejoy.dongnecafe.security.utils.JwtTokenUtils import io.beaniejoy.dongnecafe.security.handler.CustomAccessDeniedHandler import io.beaniejoy.dongnecafe.security.handler.CustomAuthenticationEntryPoint import org.springframework.beans.factory.annotation.Autowired diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/JwtAuthenticationConfigurer.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/JwtAuthenticationConfigurer.kt deleted file mode 100644 index fe2d26b..0000000 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/JwtAuthenticationConfigurer.kt +++ /dev/null @@ -1,25 +0,0 @@ -package io.beaniejoy.dongnecafe.security - -import io.beaniejoy.dongnecafe.security.filter.JwtAuthenticationFilter -import org.springframework.security.config.annotation.SecurityConfigurerAdapter -import org.springframework.security.config.annotation.web.builders.HttpSecurity -import org.springframework.security.web.DefaultSecurityFilterChain -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter - -class JwtAuthenticationConfigurer : - SecurityConfigurerAdapter() { - private lateinit var jwtTokenUtils: JwtTokenUtils - - override fun configure(http: HttpSecurity) { - http - .addFilterBefore( - JwtAuthenticationFilter(this.jwtTokenUtils), - UsernamePasswordAuthenticationFilter::class.java - ) - } - - fun jwtTokenUtils(jwtTokenUtils: JwtTokenUtils): JwtAuthenticationConfigurer { - this.jwtTokenUtils = jwtTokenUtils - return this - } -} \ No newline at end of file diff --git a/dongne-service-api/src/main/resources/application.yml b/dongne-service-api/src/main/resources/application.yml index 433ac99..55d9795 100644 --- a/dongne-service-api/src/main/resources/application.yml +++ b/dongne-service-api/src/main/resources/application.yml @@ -5,10 +5,10 @@ spring: driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: - ddl-auto: none # flyway migration 사용 + ddl-auto: none properties: hibernate: - dialect: org.hibernate.dialect.MySQL5InnoDBDialect + dialect: org.hibernate.dialect.MySQL8Dialect format_sql: true show-sql: false devtools: