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이 아니므로 알림창 표시
이메일 인증하면 경고창 사라짐
참고
'Dot Programming > Spring Clone' 카테고리의 다른 글
[스프링 웹앱 프로젝트 #18] 로그인 로그아웃 (0) | 2020.12.08 |
---|---|
[스프링 웹앱 프로젝트 #17] 가입 확인 이메일 재전송 (0) | 2020.12.08 |
[스프링 웹앱 프로젝트 #15] 첫 페이지 보완 (Fontawesome, Jdenticon 사용) (0) | 2020.12.01 |
[스프링 웹앱 프로젝트 #14] 뷰 중복 코드 제거 (0) | 2020.11.30 |
[스프링 웹앱 프로젝트 #13] 프론트엔드 라이브러리 설정 (0) | 2020.11.27 |