반응형
Spring Securit 환경 설정
요청에 따른 인증정보를 Filter를 통해서 가져오고 해당 인증을 가지고 권한체크를 진행한다. 권한 체크 후 발생한 예외는 AccessDeniedHandler, AuthenticationEntryPoint를 가지고 처리한다.
인증 처리 필터 등록
http
.authorizeRequests()
.and()
.addFilterBefore(new AuthenticationRequestFilter(authenticationManager), UsernamePasswordAuthenticationFilter.class);
권한 체크 대상 설정
WebSecurityConfigurerAdapter을 상속받아 WebSecurity, HttpSecurity를 설정한다.
- WebSecurity의 경우 권한체크를 하지 않을 URL을 등록한다.
- HttpSecurity의 경우 권한체크 URL을 등록한다.
ErrorContoller 등록
Srping boot에서 에러 발생 시 /error로 redirect가 진행됨으로 /error 컨트롤러를 생성하여 처리한다.
/**
* Rest error controller 처리
*/
@Controller
@RequestMapping("/error")
public class RestErrorController extends DefaultErrorController {
@RequestMapping
public ResponseEntity<RestResult> errorRest(HttpServletRequest request) {
HttpStatus status = getStatus(request);
final RestErrorHandler restErrorHandler = ApplicationContextProvider.getBeanSafety(RestErrorHandler.class);
if (restErrorHandler != null) {
RestResult result = restErrorHandler.handleError(request, status);
if (result != null) {
return new ResponseEntity<RestResult>(result, status);
}
}
return new ResponseEntity<RestResult>(RestErrResult.failure(RestUtils.getCurrentApiHeader(), getResponseCode(request)), status);
}
private ResponseCode getResponseCode(HttpServletRequest request) {
HttpStatus status = getStatus(request);
// 권한 없음.
if (HttpStatus.FORBIDDEN.equals(status)) {
return SecurityResponseCode.HAS_NOT_TO_EXECUTE_FUNCTION_AUTHORITIES;
}
// 404
if (HttpStatus.NOT_FOUND.equals(status)) {
return ResponseCode.CANNOT_FOUND_RESOURCE;
}
if (request.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION) != null) {
return SecurityResponseCode.HAS_NOT_AUTHENTICATION_REQUEST;
}
return ResponseCode.UNKNOWN_ERROR;
}
}
Exception Handler 등록
컨트롤 단까지 들어와서 발생한 예외의 경우 @RestControllerAdvice를 사용하여 @ExceptionHandler(Exception.class)를 등록해준다.
@RestControllerAdvice
@Slf4j
public class RestBaseExceptionHandler {
@ExceptionHandler(Exception.class)
public Object handleException(HttpServletRequest request, Exception e, HandlerMethod handlerMethod) {
log.error(ExceptionUtils.getStackTrace(e));
final RestExceptionHandler restExceptionHandler = ApplicationContextProvider.getBeanSafety(RestExceptionHandler.class);
if (restExceptionHandler != null) {
Object result = restExceptionHandler.handleException(request, e, handlerMethod);
if (result != null) {
return result;
}
}
return this.getExcetionResult(request, e, handlerMethod);
}
반응형