본문으로 바로가기

Spring Security

category BackendSpring 4년 전
  1. Spring Securit 환경 설정
    1. 인증 처리 필터 등록
    2. 권한 체크 대상 설정
    3. ErrorContoller 등록
    4. Exception Handler 등록
반응형

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