티스토리 뷰

Study/Java

UserDetailsService

Myclude 2022. 10. 4. 20:23

스프링에서 사용하는 UserDetails서비스는 시큐리티가 유저 객체가 존재하는지 각각의 서비스 구현체(inMemory, DAO 등) 를 통해 검색하게 되고 검색된 유저정보를 UserDetails 객체로 변환해서 AuthenticationProvider로 리턴하는 기능을 담당하고 있다. 

만약 등록된 사용자가 없는 경우 UsernameNotFoundException 을 리턴하게 된다.

 

UserDetilasService는 인터페이스이며 하나의 메소드만을 가지고 있다.

이를 사용하는 우리는 각각의 시스템의 특성에 맞는 UserDetailsService를 커스터마이징 해서 구현을 하게 되며 기본 적인 규현은 다음과 같다. 

간단하게 DB 검색을 통해 유저가 있는 지 확인 후 User 객체를 생성한다.

@Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        Account account = userRepository.findByUsername(username);

        if (account == null) {
            throw new UsernameNotFoundException("UsernameNotFoundException!!");
        }

        Set<GrantedAuthority> roles = new HashSet<>();
        //roles.add(new SimpleGrantedAuthority("ROLE_USER"));
        roles.add(new SimpleGrantedAuthority(account.getRole()));

        return new AccountContext(account, roles);
    }

여기서 만들어지는 AccountContext 는 User 클래스를 상속받는 자식 클래스이다. 

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;
    }
}

마지막으로 기존에는 해당 커스텀 서비스를 WebSecurityConfigurerAdapter 하위 configure 메소드에서 설정을 했었다.  

public class SecurityConfig extends WebSecurityConfigurerAdapter {

	@Autowired
    private UserDetailsService userDetailsService;
    ...
    
    @Ovrride
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
    }
    
    ...
}

하지만 Spring Security 의 버전이 올라가면서  WebSecurityConfigurerAdapter 는 더이상 사용되지 않기 때문에 다음과 같이 Bean 설정으로 대체 되었다. 

@Bean
public AuthenticationProvider authenticationProvider() {
    DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
    authenticationProvider.setUserDetailsService(userDetailsService);
    authenticationProvider.setPasswordEncoder(passwordEncoder);
    return authenticationProvider;
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함