본문 바로가기
스프링과 JPA 기반 웹 어플리케이션 개발/1부 (개발환경, 회원가입, 로그인, 계정설정)

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

by Backchus 2020. 4. 20.

스프링 시큐리티의 스프링 웹 MVC 지원

  • @AuthenticationPrincipal
    • 핸들러 매개변수로 현재 인증된 Principal을 참조할 수 있다.
  • Principal을 어디에 넣었더라?
package me.weekbelt.studyolle.account;

@RequiredArgsConstructor
@Service
public class AccountService {

    // 기존 코드 .......

    public void login(Account account) {
        // username과 password를 조합해서 UsernamePasswordAuthenticationToken 인스턴스를 생성
        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
                account.getNickname(),
                account.getPassword(),
                List.of(new SimpleGrantedAuthority("ROLE_USER")));

        SecurityContext context = SecurityContextHolder.getContext();
        context.setAuthentication(token);
    }
}

 

  • @AuthenticationPrincipal은 SpEL을 사용해서 Principal 내부 정보에 접근할 수도 있다.
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : account")
  • 인증을 하지 않은상태라면 anonymousUser라는 문자열이 리턴되고 인증이 되었다면 인증된 계정의 객체를 반환한다.
  • 익명 인증인 경우에는 null로 설정하고, 아닌 경우에는 account 프로퍼티를 조회해서 설정하라.

 

MainController 생성

package me.weekbelt.studyolle.main;

@Controller
public class MainController {

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

 

@CurrentUser 생성

package me.weekbelt.studyolle.account;

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

 

UserAccount 생성

package me.weekbelt.studyolle.account;

@Getter
public class UserAccount extends User {

    private Account account;

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


}

 

AccountService에서 login메소드 수정

package me.weekbelt.studyolle.account;

@RequiredArgsConstructor
@Service
public class AccountService {

    // 기존 코드 ...................

    public void login(Account account) {
        // username과 password를 조합해서 UsernamePasswordAuthenticationToken 인스턴스를 생성
        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
                new UserAccount(account),    <= 수정
                account.getPassword(),
                List.of(new SimpleGrantedAuthority("ROLE_USER")));

        SecurityContext context = SecurityContextHolder.getContext();
        context.setAuthentication(token);
    }
}

 

메인 페이지

처음 메인페이지 요청

 

처음 메인 페이지로 왔을때 계정 인증 이메일을 확인하는 경고가 뜨지 않는 이유는

<div class="alert alert-waring" role="alert" th:if="${account != null && !account.emailVerified}">
    스터디올레 가입을 완료하려면
    <a href="#" th:href="@{/check-email}" class="alert-link">계정 인증 이메일을 확인</a>
    하세요.
</div>

index.html에서 위에 account가 null이기 때문이다.

 

따라서 가입을 하고 메인페이지로 이동하면

회원가입 후

아직 이메일 인증을 하지 않았기 때문에 경고가 뜨게 된다.

 

그렇다면 이메일 인증 후에 경고 창이 안 뜨는지 확인해보자.

콘솔창에 주어진 토큰을 주소창에 입력하여 인증하고 다시 메인 페이지로 이동하면

이메일 인증후 메인화면

이메일 인증을 하라는 경고문구가 사라진 걸 볼 수 있다.

 

 

참고: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-JPA-%EC%9B%B9%EC%95%B1#

 

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

이 강좌에서 여러분은 실제로 운영 중인 서비스를 스프링, JPA 그리고 타임리프를 비롯한 여러 자바 기반의 여러 오픈 소스 기술을 사용하여 웹 애플리케이션을 개발하는 과정을 학습할 수 있습니다. 이 강좌를 충분히 학습한다면 여러분 만의 웹 서비스를 만들거나 취직에 도움이 될만한 포트폴리오를 만들 수 있을 겁니다. 활용 웹 개발 프레임워크 및 라이브러리 Java Spring Spring Boot Spring Data JPA Thymeleaf 온라인 강의 스

www.inflearn.com