SecController.java
@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
...
@PostMapping("/join")
public String joinProc(User user) {
user.setPassword(passwordEncoder.encode(user.getPassword()));
user.setRole("ROLE_USER");
userRepository.save(user);
return "redirect:/login";
}
회원가입페이지에서 /join 으로 Post 요청을 보낼시, 위 메소드가 동작한다
이때, 비밀번호를 암호화 하기위해, SecurityConfig에서 Bean으로 등록했던 PasswordEncoder를 사용하였다.
권한은 ROLE_USER권한으로 지정하였다
PrincipalDetails.java
public class PrincipalDetails implements UserDetails{
private User user;
public PrincipalDetails(User user){
this.user = user;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
// User의 권한을 리턴
Collection<GrantedAuthority> collect = new ArrayList<>();
collect.add(new GrantedAuthority() {
@Override
public String getAuthority(){
return user.getRole();
}
});
return collect;
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getUsername();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
PrincipalDetailsService.java
@Service
@Log4j2
public class PrincipalDetailsService implements UserDetailsService{
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
log.info("loadUserByUsername");
log.info(username);
User user = userRepository.findByUsername(username);
log.info(user);
return new PrincipalDetails(user);
}
}
login 요청시, loadUserByUsername(String username) 메소드가 실행된다
링크에서 위 두 개념에 대해 더 자세히 공부해보자