본문으로 바로가기

Spring Security

category Backend/Spring 2021. 6. 20. 16:22
    반응형

    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);
        }
    
    반응형