JPA + H2 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
Account Entity
@Entity
public class Account {
@Id @GeneratedValue
private Integer id;
@Column(unique = true)
private String username;
private String password;
private String role;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public void encodePassword() {
this.password = "{noop}" + this.password;
}
}
AccountRepository
public interface AccountRepository extends JpaRepository<Account, Integer> {
Account findByUsername(String username);
}
AccountService
/**
* SecurityConfig에
* protected void configure(AuthenticationManagerBuilder auth) throws Exception {
* auth.userDetailsService(accountService);
* 로 등록 해도 되지만 UserDetailsService의 구현체가 bean으로 등록되어 있어도 사용가능함
*/
@Service
public class AccountService implements UserDetailsService {
@Autowired
AccountRepository accountRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Account account = accountRepository.findByUsername(username);
if (account == null) {
throw new UsernameNotFoundException(username);
}
return User.builder()
.username(account.getUsername())
.password(account.getPassword())
.roles(account.getRole())
.build();
}
public Account createNew(Account account) {
account.encodePassword();
return accountRepository.save(account);
}
}
- SpringSecurity의 Password 기본 정책은 Password은 인코딩 되어 있어야하고 어느 인코딩 방식인지 {xxxcrypt}1234 처럼 포맷으로 작성되어야한다
SecurityConfig
- inmemory user 추가부분을 삭제한다
해결한 문제
- 패스워드가 코드에 노출되지 않는다
- DB를 사용하여 계정관리가 가능하다
- 여러 사용자를 role에 맞게 등록 가능하다
새로운 문제
- 패스워드에 기본 포맷 {noop}1234 와 같은 형식을 사용하지 않을 수 있을까
- 테스트가 너무 불편하다
'스터디-Spring' 카테고리의 다른 글
[스프링 시큐리티] 스프링 시큐리티 테스트 - RequestPostProcessor, Annotations (0) | 2022.01.09 |
---|---|
[스프링 시큐리티] 스프링 시큐리티 커스터마이징 - PasswordEncoder (0) | 2022.01.08 |
[스프링 시큐리티] 스프링 시큐리티 커스터마이징 - 인메모리 유저 추가 (0) | 2022.01.07 |
[스프링 시큐리티] 스프링 시큐리티 설정하기 (0) | 2022.01.07 |
[스프링 시큐리티] 스프링 시큐리티 연동 (0) | 2022.01.07 |