[Spring] Spring Security User 커스텀하기

이신영·2023년 4월 4일
0
post-thumbnail
post-custom-banner

기존 코드에서는 Spring Security에User에서 username, password, authorities만 생성하였지만, nickname을 추가하여 사용하고싶기때문에 UserDetails의 User 객체를 커스텀해보고자한다.

UserDetails : 사용자의 인증 및 권한 정보를 제공하는 인터페이스
User : UserDetails 인터페이스를 구현한 클래스. 보통 username, password, authorities를 저장


User 커스텀하기

@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()를 통해 로그인된 사용자 정보를 가져오는 메소드 추가


UserSecurityService 변경

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)이 보임

목록에 작성자 추가

상세보기에도 추가


후기

이게 제일 효율적인 방법이라 생각해서 이렇게 짜냈는데 나름 잘 짜낸듯? 이것또한 임시방편일라나? 좀 더 공부하면서 제한사항이 생기면 알게되겠지?

profile
후회하지 않는 사람이 되자 🔥
post-custom-banner

0개의 댓글