스프링 시큐리티 - UserDetailsService 고민

jinvicky·2023년 4월 8일
0

2023 Spring Project TIL

목록 보기
32/32

별건 아니고, 시큐리티를 판매자, 사용자 각각 적용해야 해서 진땀을 빼고 있다.
시큐리티 따라 했던 기존 예제를 다 뜯어보고 고쳐보고 하는 와중에 그냥 든 생각을 적었다.
시큐리티는 아래 그림과 같은 구조를 가지는 것으로 추정된다.

@Slf4j
@Service("loginService")
public class UserLoginService implements UserDetailsService {

//    @Autowired
//    private SqlSessionTemplate sqlSession;

    @Autowired
    UserDao userDao;

    @Override
    public UserDetails loadUserByUsername(String username) {

        ArrayList<String> authList = new ArrayList<String>();
//        Dao dao = sqlSession.getMapper(Dao.class);

//        UserDetailsDto userDetailsDto = dao.selectUser(username);
//        authList = dao.getAuthList(username);

        try {
            UserDetailsDto userDetailsDto = userDao.getUserByEmail(username);
            log.info("...authList" + authList);
            log.info("....loginservice" + userDetailsDto);

            if (userDetailsDto == null) { //User을 찾지 못했을 경우
                log.info("....nulll userDetailsDto...jinvicky" + userDetailsDto);
                throw new UsernameNotFoundException(username); //예외 던지면 catch가 받음. 쩔수없다.
            } else {
                //기존 예제와 달라서 구조를 달리할 필요가 있었다.
                User user = userDao.getUser(username);
                authList = (ArrayList<String>) userDao.getAuthList(user.getAuth_idx());
                userDetailsDto.setAuthority(authList);
            }
            return userDetailsDto; //완전한 UserDetails 객체

        } catch (Exception e) {
            e.printStackTrace();
//            throw new UsernameNotFoundException(username);
            return null; //위에서 예외를 던져도 여기서 또 던지는 건 의미가 없을 거 같다.
        }
    }
}

이게 내 UserDetailsService 코드인데 보니까 이걸 호출해서 처리하는 AuthenticationProvider에서 UserDetailsDto == null 인지 확인하는 것이었다.
그래서 나는 어차피 호출하는 쪽에서 null체크를 한다면 여기서 예외를 던지지 말고 그냥
null을 반환하면 안되나?라고 생각했다.

내 코드는 어차피 userDao.selectUser(String email)로 인해서 try-catch 처리가 필요하다.
그래서 위에서 예외를 던져도 catch에서 처리를 하는데 거기서 또 예외를 던진다고?
사용자를 못 찾으면 바로 null을 리턴하고 dao에서 예외가 발생하면 그 때 catch에서 예외를 던지는 걸로 고쳤다. 틀리면 그 때 가서 후회하자 뭐.

@Slf4j
@Service("loginService")
public class UserLoginService implements UserDetailsService {

    @Autowired
    UserDao userDao;

    @Override
    public UserDetails loadUserByUsername(String username) {

        ArrayList<String> authList = new ArrayList<String>();

        try {
            UserDetailsDto userDetailsDto = userDao.getUserByEmail(username);

            if (userDetailsDto == null) return null;
            else {
                User user = userDao.getUser(username);
                authList = (ArrayList<String>) userDao.getAuthList(user.getAuth_idx());
                userDetailsDto.setAuthority(authList);
            }
            return userDetailsDto;

        } catch (Exception e) {
            e.printStackTrace();
            throw new UsernameNotFoundException(username);
        }
    }
}
profile
Front-End와 Back-End 경험, 지식을 공유합니다.

0개의 댓글

관련 채용 정보