본문 바로가기

Dot Programming/Spring Clone

[스프링 웹앱 프로젝트 #16] 현재 인증된 사용자 정보 참조

17. 현재 인증된 사용자 정보 참조

스프링 시큐리티의 스프링 웹 MVC 지원
 > @AuthenticaitonPrincipal
  >> 핸들러 매개변수로 현재 인증된 Principal을 참조할 수 있다.

> Principal 위치? 
// Token자체가 Authentication으로 바뀌는데 첫 번째로 넘겨주는 파라미터가  Principal이 된다
public void login(Account account){
   UsernamePasswordAuth~Token token = new Username~Token(
                                                                          account.getNickname(),
                                                                          account.getPassword(),
                                                                          List.of(new SimpleGrantedAuth~("ROLE_USER")));
    SecurityContextHolder.getContext().setAuthentication(token);
}

 > @AuthenticationPrincipal은 SpEL을 사용해서 Principal의 내부 정보에 접근할 수 있다.
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : account")

 > 익명 인증인 경우에는 null로 설정하고, 아닌 경우에는 account 프로퍼티를 조회해서 설정하라.

 

저번 시간에 하다만 로그인 할 때 경고메세지 띄우기

 

MainController.java

@Controller
public class MainController {

    @GetMapping("/")
    public String home(@CurrentUser Account account, Model model){
        if (account != null){
            model.addAttribute(account);
        }

        return "index";
    }

}

 

@CurrentUser 인터페이스 생성

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : account")
public @interface CurrentUser {
}

 

UserAccount.java 생성

/**
 * SpringSecurity가 다루는 유저정보와
 * Domain에서 다루는 유저정보를 연결해주는 어댑터 역할
 */

@Getter
public class UserAccount extends User {

    // currentUser account와 일치
    private Account account;

    public UserAccount(Account account) {
        super(account.getNickname(), account.getPassword(), List.of(new SimpleGrantedAuthority("ROLE_USER")));
        this.account = account;
    }

}

 

 

AccountService.java에서 Principal 정보 new UserAccount(account)로 변경

 public void login(Account account) {
        log.info("principal : "+  new UserAccount(account));
        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
                new UserAccount(account),
                account.getPassword(),
                List.of(new SimpleGrantedAuthority("ROLE_USER")));

        SecurityContextHolder.getContext().setAuthentication(token);

    }

 

 

경고 메세지 확인

이제 account를 받아오는 작업을 했으니 저번시간에 설정한 경고 메세지가 뜨는지 확인해보자.

 

회원가입 후  자동 로그인하면 아래와 같이 된다.

 

1. 회원 가입 후 이메일 체크 토큰 생성

2. login과 함께 principal정보 제공

3. redirect:/ 와 함께 maincontroller 작동 (프론트 쪽으로 account정보 제공)

 

account != null이 아니므로 알림창 표시

 

이메일 인증하면 경고창 사라짐

 


참고

인프런 강의 - 스프링과 JPA 기반 웹 애플리케이션 개발