본문 바로가기
Spring

Spring Day 12 : @AuthenticationPrincipal

by 우 석 2024. 2. 5.

@AuthenticationPrincipal

Spring Security(인증과 권한 검사처리 기능을 제공하는 프레임워크 )에서 제공하는 어노테이션으로, 현재 인증된 사용자의 정보를 주입받을 때 사용됩니다. @AuthenticationPrincipal 어노테이션은 현재 인증된 사용자의 정보를 가져오기 위해 사용되며, 주로 컨트롤러의 메서드 매개변수에 적용됩니다.

 

사용자 정보 주입

@AuthenticationPrincipal 어노테이션을 사용하여 UserDetailsService에서 반환한 UserDetails 객체를 주입받아 사용합니다. 따라서  현재 인증된 사용자의 정보를 주입받을 받아 사용자의 ID나 정보를 가져옵니다. 

// Todo 작성
@PostMapping("/todo")
public ResponseEntity<TodoResponseDto> postTodo(@RequestBody TodoRequestDto requestDto, @AuthenticationPrincipal UserDetailsImpl userDetails) {
    return ResponseEntity.ok(todoService.postTodo(requestDto, userDetails.getUser()));
}

 

<코드>

UserDetailsImpl

public class UserDetailsImpl implements UserDetails {

    private final User user;

    public UserDetailsImpl(User user) {
        this.user = user;
    }

    public User getUser() {
        return user;
    }

    @Override
    public String getPassword() {
        return user.getPassword();
    }

    @Override
    public String getUsername() {
        return user.getUsername();
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        UserRoleEnum role = user.getRole();
        String authority = role.getAuthority();

        SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(authority);
        Collection<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(simpleGrantedAuthority);

        return authorities;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

 

UserDetailsServiceImpl

@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    private final UserRepository userRepository;

    public UserDetailsServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username)
                .orElseThrow(() -> new UsernameNotFoundException("Not Found " + username));

        return new UserDetailsImpl(user);
    }
}