기존 코드에서는 Spring Security에User에서 username, password, authorities만 생성하였지만, nickname을 추가하여 사용하고싶기때문에 UserDetails의 User 객체를 커스텀해보고자한다.
UserDetails
: 사용자의 인증 및 권한 정보를 제공하는 인터페이스
User
: UserDetails 인터페이스를 구현한 클래스. 보통 username, password, authorities를 저장
@Getter
public class CustomUser extends User {
private final String nickname;
public CustomUser(String username, String password, Collection<? extends GrantedAuthority> authorities, String nickname) {
super(username, password, authorities);
this.nickname = nickname;
}
}
User객체에 nickname을 추가하기위해 User를 상속받는 커스텀 클래스
public class UserSecurityService implements UserDetailsService {
public CustomUser getCurrentUser() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Object principal = authentication.getPrincipal();
if (principal instanceof CustomUser) {
return (CustomUser) principal;
}
else {
return null;
}
}
SecurityContextHolder()
를 통해 로그인된 사용자 정보를 가져오는 메소드 추가
public class UserSecurityService implements UserDetailsService {
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
...
return new User(member.getUsername(), member.getPassword(), authorities);
}
리턴을 변경
public class UserSecurityService implements UserDetailsService {
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
...
//User 객체를 상속받는 CustomUser 객체 생성
CustomUser customUser = new CustomUser(member.getUsername(), member.getPassword(), authorities, member.getNickname());
return customUser;
}
로그인 시에 홈페이지에 닉네임(lsin)이 보임
목록에 작성자 추가
상세보기에도 추가
이게 제일 효율적인 방법이라 생각해서 이렇게 짜냈는데 나름 잘 짜낸듯? 이것또한 임시방편일라나? 좀 더 공부하면서 제한사항이 생기면 알게되겠지?