페이지 접근 권한을 설정
상품 등록 페이지는 ADMIN. 즉, 관리자 계정에서만 접근이 가능하고 일반 USER 계정은 접근을 할 수 없도록 설정하는 것이 필요했다. 이를 위해 상품등록 페이지에 접근하는 컨트롤러 (ItemController
) 를 구현하고 ItemController
에서 상품등록을 관리자로 접근하는 주소("/admin/item/new") 만 접속할 수 있게끔 GetMapping
을 해주었다.
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";
}
또한, 인증되지 않은 사용자가 리소스를 요청할 경우, "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");
}
}
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()
를 통해 시큐리티 처리를 진행했다.permitAll()
을 통해 모든 사용자가 접근할 수 있도록 했다./admin
으로 시작하는 경로는 해당 계정이 ADMIN Role 일 경우에만 접근이 가능하도록 설정했다.anyRequest().authenticated()
를 통해 이외 나머지 경로들은 모두 인증을 요구하도록 설정했다.http.exceptionHandling().authenticationEntryPoint(new CustomAuthenticationEntryPoint());