스프링 시큐리티 UserDetailService

greenTea·2023년 3월 19일

UserDetailService

스프링 시큐리티에서는 다양한 과정을 거쳐 인증을 하게 되는데 이번에 배워 볼 단계는 UserDetailService이다.Provider에서 검증하기전에 먼저 해당 유저의 정보를 가져와야 하는데 이 때 사용하는 것이 UserDetailService이다. 개념은 기본적인 service와 비슷하다.


@Repository
public interface UserRepository extends JpaRepository<MyUser, Long> {
    // username으로 User를 찾아 반환하는 메소드
    Optional<MyUser> findByUsername(String username);
}

spring data jpa를 이용해 repository를 생성하였다.

@Service
public class UserService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        MyUser user = userRepository.findByUsername(username)
            .orElseThrow(() -> new UsernameNotFoundException("User not found with username: " + username));

        List<GrantedAuthority> authorities = user.getRoles().stream()
            .map(role -> new SimpleGrantedAuthority("ROLE_" + role.getName()))
            .collect(Collectors.toList());

        return new User(
            user.getUsername(),
            user.getPassword(),
            authorities
        );
    }
}

이후 UserDetailService를 implements하여 구현하였는데 loadUserByUsername메소드를 통해 User 객체를 반환하여야 한다. 이 때 UserUserDetails를 extends한 security 객체이다. loadUserByUsername메소드에서는 repository를 통해 user를 가져오는데 이 때 user가 없으면 exception을 throw하고 만약 존재한다면 name, password, authority를 담아서 provider로 보내주면 된다.

profile
greenTea입니다.

0개의 댓글