@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());