스프링 시큐리티의 스프링 웹 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
'스프링과 JPA 기반 웹 어플리케이션 개발 > 1부 (개발환경, 회원가입, 로그인, 계정설정)' 카테고리의 다른 글
17. 로그인 / 로그아웃 (0) | 2020.04.20 |
---|---|
16. 확인 가입 이메일 재전송 기능 (0) | 2020.04.20 |
14. 첫 페이지 보완 (0) | 2020.04.20 |
13. 뷰 중복 코드 제거 (0) | 2020.04.19 |
12. 프론트엔드 라이브러리 설정 (0) | 2020.04.19 |