페이지 권한 설정 (USER, ADMIN)

jihan kong·2023년 2월 14일
0
post-thumbnail
post-custom-banner

페이지 접근 권한을 설정

상품 등록 페이지는 ADMIN. 즉, 관리자 계정에서만 접근이 가능하고 일반 USER 계정은 접근을 할 수 없도록 설정하는 것이 필요했다. 이를 위해 상품등록 페이지에 접근하는 컨트롤러 (ItemController) 를 구현하고 ItemController 에서 상품등록을 관리자로 접근하는 주소("/admin/item/new") 만 접속할 수 있게끔 GetMapping 을 해주었다.

1. ItemController 클래스 작성

ItemController.java

package com.shop.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
@RequiredArgsConstructor
public class ItemController {

    private final ItemService itemService;

    @GetMapping(value = "/admin/item/new")
    public String itemForm(Model model) {
        model.addAttribute("itemFormDto", new ItemFormDto());
        return "item/itemForm";
    }

2. Authentication EntryPoint 인터페이스 구현

또한, 인증되지 않은 사용자가 리소스를 요청할 경우, "Unauthorized" 에러를 발생시키기 위해 Authentication EntryPoint 인터페이스를 구현했다.

package com.shop.config;

import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response,
                         AuthenticationException authException) throws IOException, ServletException {
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");        
    }

}

3. SecurityConfig 설정

SecurityConfig

package com.shop.config;

import com.shop.config.auth.PrincipalOauth2UserService;
import com.shop.service.MemberService;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

@RequiredArgsConstructor
@Configuration
@EnableWebSecurity
@AllArgsConstructor
public class SecurityConfig {
	
    	// 코드 생략

        http.authorizeRequests()                        
                .mvcMatchers("/css/**", "/js/**", "/img/**").permitAll()    
                .mvcMatchers("/", "/members/**", "/item/**", "/images/**").permitAll()
                .mvcMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated();                   

        http.exceptionHandling()
                .authenticationEntryPoint(new CustomAuthenticationEntryPoint());         
        
        return http.build();
    }
    
    @Bean
    public void configure(WebSecurity web) throws Exception{
        web.ignoring().antMatchers("/css/**", "/js/**", "/img/**");
    }
    
    @Bean
    public BCryptPasswordEncoder encodePassword() {
        return new BCryptPasswordEncoder();
    }
}
  • http.authorizeRequests() 를 통해 시큐리티 처리를 진행했다.
  • 메인페이지, 회원 관련 URL, 상품 상세페이지, 상품이미지와 같은 정보는 로그인 없이도 이용할 수 있도록 permitAll() 을 통해 모든 사용자가 접근할 수 있도록 했다.
  • /admin 으로 시작하는 경로는 해당 계정이 ADMIN Role 일 경우에만 접근이 가능하도록 설정했다.
  • anyRequest().authenticated() 를 통해 이외 나머지 경로들은 모두 인증을 요구하도록 설정했다.
  • http.exceptionHandling().authenticationEntryPoint(new CustomAuthenticationEntryPoint());
    로 인증되지 않은 사용자가 리소스에 접근했을 때 예외 처리를 수행하도록 핸들러를 구성했다.
profile
학습하며 도전하는 것을 즐기는 개발자
post-custom-banner

0개의 댓글