본문 바로가기

카테고리 없음

24.01.17 인가2

비영속(new/transient)

비영속 상태는 객체를 새로 생성한 상태입니다.

JPA와 전혀 관계없이 객체만 생성한 상태입니다.

 

영속(managed)

영속성 컨텍스트에 의해서 관리되어지는 상태입니다.

 

생성한 객체를 em.persist()를 통해 영속성 컨텍스트에 저장하거나,

혹은 em.find()를 통해 DB에서 엔티티를 조회하면 영속성 컨텍스트에 저장되어 관리되어지므로 이때 영속 상태가 됩니다.

 

 

준영속 (detached)

영속성 컨텍스트에 저장되었다가 분리된 상태로 현재는 영속 상태가 아닌 상태입니다.

따라서 영속성 컨텍스트가 제공하는 기능을 사용하지 못합니다.

하지만 준영속은 중요하지 않다.

 

단방향이 다방향보다 잘 쓰인다.

 

인증인가 쓰는법

implementation("org.springframework.boot:spring-boot-starter-security") implementation("io.jsonwebtoken:jjwt-api:0.12.3") runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.3") runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.3")

이걸 그래들에 넣고

 

어플리케이션.ymlspringframework:

        security: debug  추가!

spring:

  datasource:

    url: jdbc:postgresql://db.akenemuwmwbarcaefoup.supabase.co:5432/postgres

    username: postgres

    password: akehzkal13!

jpa:

  properties:

    hibernate:

      show_sql: true

      format_sql: true

      highlight_sql: true

logging:

  level:

    org:

      hibernate:

        SQL: debug

        orm:

          jdbc:

            bind: trace

      springframework: # 추가!

        security: debug

이렇세됨

 

거기에

auth: jwt: issuer: team.sparta.com secret: PO4c8z41Hia5gJG3oeuFJMRYBB4Ws4aZ accessTokenExpirationHour: 168도 추가해서

 

 

spring:

  datasource:

    url: jdbc:postgresql://db.akenemuwmwbarcaefoup.supabase.co:5432/postgres

    username: postgres

    password: akehzkal13!

jpa:

  properties:

    hibernate:

      show_sql: true

      format_sql: true

      highlight_sql: true

logging:

  level:

    org:

      hibernate:

        SQL: debug

        orm:

          jdbc:

            bind: trace

      springframework:

        security: debug

auth:

  jwt:

    issuer: team.sparta.com

    secret: PO4c8z41Hia5gJG3oeuFJMRYBB4Ws4aZ

    accessTokenExpirationHour: 168

이렇게 만들어야 한다.

 

그리고 nfra 패키지 하위에 security 패키지를 생성하고, SecurityConfig 클래스를 작성하여 FilterChain을 만든다

package com.teamsparta.todo.infra.security

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
import org.springframework.security.web.SecurityFilterChain

@Configuration
@EnableWebSecurity
class SecurityConfig {

    @Bean
    fun filterChain(http: HttpSecurity): SecurityFilterChain {
        return http
            .httpBasic { it.disable() } // BasicAuthenticationFilter, DefaultLoginPageGeneratingFilter, DefaultLogoutPageGeneratingFilter 제외
            .formLogin { it.disable() } // UsernamePassworedAuthenticationFilter, DefaultLoginPageGeneratingFilter, DefaultLogoutPageGeneratingFilter 제외
            .csrf { it.disable() } // CsrfFilter 제외
            .build()
    }

}

그리고 이녀석을 만들어준다.

 

package com.teamsparta.courseregistration.infra.security.jwt

import io.jsonwebtoken.Claims
import io.jsonwebtoken.Jwts
import io.jsonwebtoken.security.Keys
import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Component
import java.nio.charset.StandardCharsets
import java.time.Duration
import java.time.Instant
import java.util.*

@Component
class JwtPlugin(
    @Value("\${auth.jwt.issuer}") private val issuer: String,
    @Value("\${auth.jwt.secret}") private val secret: String,
    @Value("\${auth.jwt.accessTokenExpirationHour}") private val accessTokenExpirationHour: Long,
) {

    fun validateToken(jwt: String): Result<Jws<Claims>> {
        return kotlin.runCatching {
            val key = Keys.hmacShaKeyFor(secret.toByteArray(StandardCharsets.UTF_8))
            Jwts.parser().verifyWith(key).build().parseSignedClaims(jwt)
        }
    }

    fun generateAccessToken(subject: String, role: String): String {
        return generateToken(subject, role, Duration.ofHours(accessTokenExpirationHour))
    }


    private fun generateToken(subject: String, role: String, expirationPeriod: Duration): String {
        val claims: Claims = Jwts.claims().add(mapOf("role" to role)).build()

        val now = Instant.now()
        val key = Keys.hmacShaKeyFor(secret.toByteArray(StandardCharsets.UTF_8))

        return Jwts.builder()
            .subject(subject)
            .issuer(issuer)
            .issuedAt(Date.from(now))
            .expiration(Date.from(now.plus(expirationPeriod)))
            .claims(claims)
            .signWith(key)
            .compact()
    }

}

근데왠지 hour에 빨간색이 뜬다. 왜?? 하란대로 했는데???

package com.teamsparta.todo.domain

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
import org.springframework.security.crypto.password.PasswordEncoder

@Configuration
class PasswordEncoderConfig {

    @Bean
    fun passwordEncoder(): PasswordEncoder {
        return BCryptPasswordEncoder()
    }
}

이건 되는데 왜??? 아마 당분간은 여기에 파붇혀야겠다.