- 컨트롤러에 회원, 관리자 등록
- 회원, 관리자 HTML파일 만들기
// 접근제어 설정
.authorizeHttpRequests(authorizationRequests -> authorizationRequests
.requestMatchers("/js/**", "/css/**", "/images/**").permitAll()
.requestMatchers("/login").permitAll()
// 유저 페이지는 관리자 사용자 모두 접근가능
.requestMatchers("/user/**").hasAnyRole("ADMIN", "USER")
// 관리자 페이지는 관리자만 접근 가능
.requestMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
// 에러 핸들러 설정 .exceptionHandling(exceptionHandling -> // 권한이 없는 계정에서 잘못된 접근 시 이동할 URL을 지정한다. exceptionHandling .accessDeniedPage("/access-denied") )
인증정보는 SecurityContext 안에 있다.
@GetMapping("/user/info")
public String userInfo() {
log.info("사용자별 페이지 요청");
// 1. SecurityContextHolder를 사용하는 방법
SecurityContext securityContext = SecurityContextHolder.getContext();
Authentication authentication = securityContext.getAuthentication();
User loginUser = (User) authentication.getPrincipal();
System.out.println(loginUser);
return "user/info";
}

@GetMapping("/user/info")
public String userInfo(Authentication authentication) {
log.info("사용자별 페이지 요청");
User loginUser = (User) authentication.getPrincipal();
System.out.println(loginUser);
return "user/info";
}

(없으면 파라미터인지 인증주체인지 구별 불가)
public String userInfo(@AuthenticationPrincipal User loginUser) {
log.info("사용자별 페이지 요청");
System.out.println(loginUser);
return "user/info";
}

sec:authorize사용자의 권한에 따라 HTML 요소의 표시 여부를 결정한다.<body>
<header th:fragment="header">
<p sec:authorize="hasRole('ADMIN')">관리자님 안녕하세요.😊</p>
<p sec:authorize="!hasRole('ADMIN')">
<!-- 인증된 사용자의 정보를 출력하는 데 사용한다.-->
<span sec:authentication="principal.username"></span>님 안녕하세요.
</p>
결과
isAuthenticated 인증된 사용자만 허용? / 마이페이지 구현 시 활용
sec:authorize-url현재 접속한 계정이 링크에 접속할 수 있는 권한이 있는지 확인 후 접근 가능하도록 한다.
다만, 경로에 대한 접근제한이 설정 되어야 사용가능하다.
<main>
<h3>사용자별 페이지</h3>
<!-- 인증된 사용자가 로그인하면 링크가 보인다. -->
<a th:href="@{/user/info}" sec:authorize="isAuthenticated()">사용자 페이지</a>
<a th:href="@{/user/info}" sec:authorize-url="/user/info">사용자 페이지</a>
<!-- 관리자가 로그인하면 링크가 보인다. -->
<a th:href="@{/admin/info}" sec:authorize-url="/admin/info">관리자 페이지</a>
<a th:href="@{/admin/info}" sec:authorize="hasRole('ADMIN')">관리자 페이지</a>
</main>
🍀 TIP
