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