Implements PasswordEncrypter
This commit is contained in:
@@ -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'
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.yam.app.account.domain;
|
||||
|
||||
public interface PasswordEncrypter {
|
||||
|
||||
String encode(CharSequence rawPassword);
|
||||
|
||||
boolean matches(CharSequence rawPassword, String encodedPassword);
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user