회원/관리자 페이지 실습

사과농장주·2026년 3월 19일

자바스프링

목록 보기
4/8

실습 준비하기

  • 컨트롤러에 회원, 관리자 등록
  • 회원, 관리자 HTML파일 만들기

회원▶️관리자 페이지 접근 시 에러 구현

  • SecurityCofig 파일에서 권한 설정
// 접근제어 설정
.authorizeHttpRequests(authorizationRequests -> authorizationRequests
	.requestMatchers("/js/**", "/css/**", "/images/**").permitAll()
	.requestMatchers("/login").permitAll()
    // 유저 페이지는 관리자 사용자 모두 접근가능
	.requestMatchers("/user/**").hasAnyRole("ADMIN", "USER")
    // 관리자 페이지는 관리자만 접근 가능
	.requestMatchers("/admin/**").hasRole("ADMIN")
	.anyRequest().authenticated()

유저▶️관리자 페이지 접근 하면 403 에러 발생

 // 에러 핸들러 설정
 .exceptionHandling(exceptionHandling ->
// 권한이 없는 계정에서 잘못된 접근 시 이동할 URL을 지정한다.
exceptionHandling
 .accessDeniedPage("/access-denied")
)

컨트롤러에서 인증된 사용자 정보를 가져오는 방법

AuthController에서 작업

기본 이론

인증정보는 SecurityContext 안에 있다.

1. SecurityContextHolder를 사용하는 방법

 @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";
    }

2. Authentication 객체를 메소드의 매개변수로 가져오는 방법

    @GetMapping("/user/info")
    public String userInfo(Authentication authentication) {

        log.info("사용자별 페이지 요청");

        User loginUser = (User) authentication.getPrincipal();

        System.out.println(loginUser);


        return "user/info";
    }

3. @AuthenticationPrincipal 어노테이션을 사용하는 방법 (Easy Method !)

(없으면 파라미터인지 인증주체인지 구별 불가)

    public String userInfo(@AuthenticationPrincipal User loginUser) {

        log.info("사용자별 페이지 요청");

        System.out.println(loginUser);


        return "user/info";
    }


Spring Security 권한별 화면 표시

  • 시큐리티 관련 것을 사용하기 위한 namespace common파일에 추가
    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

  • 스프링에서는 Whitelabel 에러 ON/OFF 가능
profile
안녕, 나는 코딩 밭에서 사과를 줍는 사과농장주야 🍎

0개의 댓글