[스프링부트JPA] 쇼핑몰 상품등록 권한 설정

JEONG SUJIN·2023년 1월 30일
0
post-thumbnail

ADMIM 계정만 접근할 수 있는 상품 등록 페이지 생성
templates 아래에 item 폴더 생성후 itemForm 파일 만든다.

itemForm.html

<!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>

상품등록 페이지에 접근할 수 있도록 ItemController 클래스를 생성

ItemController.java

@Controller
public class ItemController {

	@GetMapping(value="/admin/item/new")
	public String itemForm() {
		return "item/itemForm";
	} 
}

CustomAuthenticationEntryPoint.java

ajax의 경우 http request header에 XMLHttpRequest라는 값이 세팅되어 요청이 오는데, 인증되지 않은 사용자가 ajax로 리소스를 요청할 경우 "Unauthorized"에러를 발생시키고 나머지 경우는 로그인 페이지로 리다이렉트로 시켜준다.

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.java

  • authorizeRequests 시큐리티 처리에 HttpServletRequest를 이용한다는 걸 의미.
  • permiitAll()을 통해 모든 사용자가 인증(로그인)없이 해당경로에 접근할 수 있도록 설정.
  • /admin 으로 시작하는 경로는 해당 계정이 ADMIN Role일 경우에만 접근 가능하도록 설정
  • .anyRequest().authenticated() 설정해준 경로를 제외한 나머지 경로들은 모두 인증을 해야 접근가능하도록 설정
@Configuration // 빈 등록(Ioc관리)
@EnableWebSecurity
public class SecurityConfig {

	@Autowired
	UsersService usersService;

	@Bean
	public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
		http.formLogin()
				.loginPage("/user/login") //로그인페이지 URL
				.defaultSuccessUrl("/") //로그인 성공시 이동할 페이지
				.usernameParameter("email") // 로그인시 사용할 파라미터 이름 설정
				.failureUrl("/user/login/error") // 로그인 실패시 이동할 URL
				.and()  
				.logout()
				.logoutRequestMatcher(new AntPathRequestMatcher("/user/logout"))//로그아웃 URL
				.logoutSuccessUrl("/"); //로그아웃 성공시 URL

		
		http.authorizeRequests()
        		.mvcMatchers("/css/**", "/js/**", "/images/**").permitAll()
        		.mvcMatchers("/", "/user/**", "/item/**", "/images/**").permitAll()
        		.mvcMatchers("/admin/**").hasRole("ADMIN")
        		.anyRequest().authenticated();
		
		
		http.exceptionHandling()
        .authenticationEntryPoint(new CustomAuthenticationEntryPoint());
		
		return http.build();	
	}


}

User.java

User 엔티티 생성시 Role을 ADMIN으로 생성하도록 설정 변경

users.setRole(Role.ADMIN);

다시 회원가입시 ADMIN으로 가입되어서 상품등록메뉴와 상품관리메뉴랑 상품등록 페이지가 접속 되는걸 확인할 수 있다.

profile
기록하기

0개의 댓글