Skip to content

CoffeeDrivenDevelopment/sangchu-passport

Repository files navigation

Sangchu Passport

GitHub last commit (branch)

GitHub License

해당 서비스는 MSA로 이루어져 있습니다. 각 서버마다 사용자인증을 하게 된다면 중복되는 코드가 많이지게 됩니다. 또한 각 클라이언트마다 인증 객체가 다를 수 있으므로 상추에서는 각각 다른 클라이언트의 인증 요청을 하나의 Passport로 묶어 서버간의 인증을 단순화 하였습니다.

Quick Starter

1. Add Dependencies


반드시 Redis가 필요합니다.

build.gradle

repositories {
    mavenCentral()
    maven { url 'https://jitpack.io' }  // Add Repository
}

dependencies {
    // More dependencies
    implementation 'org.springframework.boot:spring-boot-starter-data-redis-reactive'
    implementation 'com.github.CoffeeDrivenDevelopment:sangchu-passport:0.0.7'
}

build.gradle.kts

repositories {
    mavenCentral()
    maven("https://jitpack.io") // Add Repository
}

dependencies {
    // More dependencies
    implementation("org.springframework.boot:spring-boot-starter-data-redis-reactive")
    implementation("com.github.CoffeeDrivenDevelopment:sangchu-passport:0.0.7")
}

2. PassportTokenRepository 생성


Redis에서 Passport를 재사용하지 못하도록 PassportToken을 저장하는 Repository를 생성합니다.

PassportTokenRepository.java

public interface PassportTokenRepository extends CrudRepository<PassportToken, String> {
}

PassportTokenRepository.kt

interface PassportTokenRepository : CurdRepository<PassportToken, String>

3. PassportConfig


Passport를 검증하는 컴포넌트를 Bean으로 등록합니다.

PassportConfig.java

@RequiredArgsConstructor
@Configuration
public class PassportConfig {
    private final PassportTokenRepository passportTokenRepository;

    @Value("${spring.application.name}")
    private String name;

    @Bean
    public PassportValidator passportValidator() {
        return new PassportValidator(passportTokenRepository, name);
    }

    @Bean
    public PassportAdvice passportAdvice() {
        return new PassportAdvice();
    }
}

PassportConfig.kt

@Configuration
class PassportConfig(
    private val passportTokenRepository: PassportTokenRepository,
    @Value("${spring.application.name}") private val name: String
) {
    @Bean
    fun passportValidator(): PassportValidator {
        return PassportValidator(passportTokenRepository, name)
    }

    @Bean
    fun passportAdvice(): PassportAdvice {
        return PassportAdvice()
    }
}

4. PassportArgumentResolversConfig


PassportArgumentResolversConfig.java

@RequiredArgsConstructor
@Configuration
public class PassportArgumentResolversConfig implements WebMvcConfigurer {
    private final ObjectMapper mapper;
    private final PassportValidator validator;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new PassportArgumentResolver(mapper, validator));
    }
}

PassportArgumentResolversConfig.kt

@Configuration
class PassportArgumentResolversConfig(
    private val mapper: ObjectMapper,
    private val validator: PassportValidator
) : WebMvcConfigurer {

    @Override
    fun addArgumentResolvers(resolvers: List<HandlerMethodArgumentResolver>) {
        resolvers.add(PassportArgumentResolver(mapper, validator))
    }
}

5. Controller


기본적인 설정이 끝났습니다. 이제 해당 기능을 사용해보도록 하겠습니다. @RequestPassport를 아래 코드와 같이 설정하면 됩니다.

java

@GetMapping("/v1")
public ResponseEntity<Void> passport(@RequestPassport Passport passport) {
    return ResponseEntity.ok()
            .headers(passport.getHeaders())
            .body(passport);
}

kotlin

@GetMapping("/v1")
fun passport(@RequestPassport passport: Passport): ResponseEntity<Void> {
    return ResponseEntity.ok()
        .headers(passport.getHeaders())
        .body(passport)
}

Dependencies

해당 프로젝트에서 사용하는 라이브러리의 모음입니다.