Implements PasswordEncrypter

This commit is contained in:
Rebwon
2021-08-27 20:07:59 +09:00
committed by MaengSol
parent deb89d16f7
commit 457e4ec721
7 changed files with 94 additions and 5 deletions

View File

@@ -40,6 +40,7 @@ dependencies {
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
runtimeOnly 'com.h2database:h2'
implementation 'org.springframework.security:spring-security-crypto:5.5.2'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-web'

View File

@@ -0,0 +1,8 @@
package com.yam.app.account.domain;
public interface PasswordEncrypter {
String encode(CharSequence rawPassword);
boolean matches(CharSequence rawPassword, String encodedPassword);
}

View File

@@ -3,9 +3,12 @@ package com.yam.app.account.domain;
public final class RegisterAccountProcessor {
private final AccountRepository accountRepository;
private final PasswordEncrypter passwordEncrypter;
public RegisterAccountProcessor(AccountRepository accountRepository) {
public RegisterAccountProcessor(AccountRepository accountRepository,
PasswordEncrypter passwordEncrypter) {
this.accountRepository = accountRepository;
this.passwordEncrypter = passwordEncrypter;
}
public Account process(String email, String nickname, String password) {
@@ -16,6 +19,8 @@ public final class RegisterAccountProcessor {
throw new IllegalStateException();
}
return accountRepository.save(new Account(email, nickname, password));
String encodedPassword = passwordEncrypter.encode(password);
return accountRepository.save(new Account(email, nickname, encodedPassword));
}
}

View File

@@ -2,14 +2,27 @@ package com.yam.app.account.infrastructure;
import com.yam.app.account.domain.AccountReader;
import com.yam.app.account.domain.AccountRepository;
import com.yam.app.account.domain.PasswordEncrypter;
import com.yam.app.account.domain.RegisterAccountProcessor;
import org.mybatis.spring.SqlSessionTemplate;
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
public class AppConfiguration {
@Bean
public PasswordEncrypter passwordEncrypter(PasswordEncoder passwordEncoder) {
return new DelegatePasswordEncrypter(passwordEncoder);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public AccountRepository accountRepository(SqlSessionTemplate sqlSessionTemplate) {
return new MybatisAccountRepository(sqlSessionTemplate);
@@ -21,7 +34,8 @@ public class AppConfiguration {
}
@Bean
public RegisterAccountProcessor registerAccountProcessor(AccountRepository accountRepository) {
return new RegisterAccountProcessor(accountRepository);
public RegisterAccountProcessor registerAccountProcessor(AccountRepository accountRepository,
PasswordEncrypter passwordEncrypter) {
return new RegisterAccountProcessor(accountRepository, passwordEncrypter);
}
}

View File

@@ -0,0 +1,24 @@
package com.yam.app.account.infrastructure;
import com.yam.app.account.domain.PasswordEncrypter;
import org.springframework.security.crypto.password.PasswordEncoder;
public final class DelegatePasswordEncrypter implements PasswordEncrypter {
private final PasswordEncoder passwordEncoder;
public DelegatePasswordEncrypter(
PasswordEncoder passwordEncoder) {
this.passwordEncoder = passwordEncoder;
}
@Override
public String encode(CharSequence rawPassword) {
return passwordEncoder.encode(rawPassword);
}
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
return passwordEncoder.matches(rawPassword, encodedPassword);
}
}

View File

@@ -0,0 +1,36 @@
package com.yam.app.account.domain;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
class PasswordEncrypterTest {
@Test
@DisplayName("비밀번호를 인코딩하고 올바르게 일치하는지 검증한다.")
void sut_password_encoded_and_matches_correctly() {
// Arrange
PasswordEncrypter sut = new PasswordEncrypterStub();
// Act
String encodedPassword = sut.encode("12345678!");
boolean result = sut.matches("12345678!", encodedPassword);
// Assert
assertThat(result).isTrue();
}
public static class PasswordEncrypterStub implements PasswordEncrypter {
@Override
public String encode(CharSequence rawPassword) {
return rawPassword.toString();
}
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
return rawPassword.toString().equals(encodedPassword);
}
}
}

View File

@@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import com.yam.app.account.application.RegisterAccountCommand;
import com.yam.app.account.domain.PasswordEncrypterTest.PasswordEncrypterStub;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
@@ -20,7 +21,7 @@ class RegisterAccountProcessorTest {
@DisplayName("회원가입 시나리오")
Collection<DynamicTest> register_account_scenarios() {
var repository = new AccountRepositoryStub();
var processor = new RegisterAccountProcessor(repository);
var processor = new RegisterAccountProcessor(repository, new PasswordEncrypterStub());
return Arrays.asList(
DynamicTest.dynamicTest("회원가입에 성공한다.", () -> {
// Arrange