이 글은 정수원님의 Infrean 강의를 학습한 내용을 정리하여 작성합니다.
DB 연동 인증 처리(1): CustomUserDetailsService
- 데이터 계층으로부터 User 객체를 조회하고 UserDetails 타입으로 반환하려한다.
- UserDetails 타입의 구현체가 필요하다.
AccountContext 생성
- 스프링 시큐리티에서는 UserDetails를 구현한 User 클래스를 제공한다.
- 이러한 User 클래스를 상속해 최종적으로 UserDetails를 상속 받도록 한다.
package io.security.corespringsecurity.security.service;
import io.security.corespringsecurity.domain.Account;
import io.security.corespringsecurity.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
public class AccountContext extends User {
private final Account account;
public AccountContext(Account account, Collection<? extends GrantedAuthority> authorities) {
super(account.getUsername(), account.getPassword(), authorities);
this.account = account;
}
public Account getAccount() {
return account;
}
}
CustomUserDetailsService 생성
UserRepository
public interface UserRepository extends JpaRepository<Account, Long> {
Account findByUsername(String username);
}
CustomUserDetailsService
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Account account = userRepository.findByUsername(username);
if (account == null) {
throw new UsernameNotFoundException("UsernameNotFoundException");
}
List<GrantedAuthority> roles = new ArrayList<>();
roles.add(new SimpleGrantedAuthority(account.getRole()));
AccountContext accountContext = new AccountContext(account, roles);
return accountContext;
}
}
- 이제 인증 처리시 우리가 구현한 customUserDetailsService를 통해 스프링 시큐리티가 데이터베이스와 연동되도록 할 수 있다.
- 데이터베이스로부터 사용자의 계정이 존재하는지 검사한다.
- 사용자의 권한 정보를 생성한다.
- UserDetails 구현체인 AccountContext를 생성해 반환한다.
실행
- 회원가입을 통해 다음과 같이 user와 manager를 생성한다.
- 그리고 user 정보를 통해 로그인을 수행하면 위에서 구현한 CustomDetailsService 클래스가 동작한다.
- 조회한 Account 객체를 사용해 AccountContext 객체를 생성해 반환한다.
'스프링 시큐리티 > 실전프로젝트 - 인증 프로세스 Form 인증 구현' 카테고리의 다른 글
커스텀 로그인 페이지 생성하기 (0) | 2023.02.11 |
---|---|
DB 연동 인증 처리(2): CustomAuthenticationProvider (0) | 2023.02.11 |
사용자 DB 등록 및 PasswordEncoder (0) | 2023.02.10 |
정적 자원 관리 - WebIgnore 설정 (0) | 2023.02.10 |
프로젝트 Dependency (0) | 2023.02.10 |