Jin's Dev Story

[스프링 부트 쇼핑몰 프로젝트 with JPA] 4. 페이지 권한 설정 본문

Web & Android/스프링 부트 쇼핑몰 프로젝트 with JPA

[스프링 부트 쇼핑몰 프로젝트 with JPA] 4. 페이지 권한 설정

woojin._. 2023. 10. 15. 10:25
이 내용은 스프링 부트 쇼핑몰 프로젝트 with JPA 책을 학습한 내용입니다.

1. 상품 등록 페이지 (미완성)

  • ADMIN (관리자) 계정만 접근할 수 있는 상품 등록 페이지

상품등록 페이지입니다.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
			xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
			layout:decorate="~{layouts/layout1}">

		<div layout:fragment="content">
				<h1>상품등록 페이지입니다.</h1>
		</div>
</html>

2. 상품 등록 페이지 접근 Controller

  • 상품 등록 페이지에 접근하는 Controller
@Controller
@RequiredArgsConstructor // @Autowired로도 쓸 수 있음
public class ItemController {

    // 웹 페이지로 이동
    @GetMapping("/admin/item/new")
    public String itemForm() {

        return "item/itemForm";
    }

3. AuthenticationEntryPoint

  • AuthenticationEntryPoint 인터페이스 구현 클래스
  • 인증되지 않은 사용자가 리소스 요청 시 “Unauthorized” 에러를 발생시킴
// 인증되지 않은 사용자 요청 시 에러
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.web.client.HttpClientErrorException;

import java.io.IOException;

public class CustomEntryPoint implements AuthenticationEntryPoint {

    @Override
    // 인증되지 않은 사용자가 리소스를 요청할 경우, Unauthorized 에러 발생하고 나머지는 로그인 페이지로 리다이렉트.
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {

        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");

    }
}

4. SecurityConfig

  • HttpServletRequest에 대해서 security 처리를 수행
  • anyRequest() - 위에 존재하는 url patterns들을 제외한 나머지 요청들
http.authorizeHttpRequests()  // 인증 여부 확인 -> 스프링 3.0 이하 버전은 authorizeRequests()로 설정
                // 스프링 3.0 이하 버전은 antMatchers(), mvcMatchers(), regexMatchers()으로 사용
                .dispatcherTypeMatchers(DispatcherType.FORWARD).permitAll() // 페이지 이동할 경우 default로 인증이 걸리도록 되어있기 때문에 추가
                .requestMatchers("/css/**", "/js/**").permitAll()  // 모든 사람에게 css 적용
                .requestMatchers("/", "/member/**", "/item/**", "/images/**").permitAll() // 아무나 페이지에 들어올 수 있고, member, item 밑에 있는 애들은 모두 permit 허용
                .requestMatchers("/admin/**").hasRole("ADMIN") // admin인 애들만 admin에 접속 가능
                .anyRequest().authenticated(); // 인증 받기
  • 권한에 맞지 않는 사용자가 리소스에 접근할 때 수행되는 핸드러
http.exceptionHandling()  // 권한이 없는 경우
                .authenticationEntryPoint(new CustomEntryPoint());

5. Role.ADMIN

  • 현재 Member 객체 생성 시 Role.USER 값이 default로 설정되어 있음
  • Role.ADMIN으로 변경 후 동작 확인