2013-10-10 2 views
13

스프링 웹 서비스 용 스프링 - MVC를 사용하고 있습니다. 그것은 사용자 등록 페이지와 개인 사용자 패널을 포함합니다. 나는 다음과 같은 URL 패턴과 현재 설정이 있습니다MVC 인터셉터 대 스프링 보안 필터 대 뭔가 ...?

  • whatever/myapp/login 사용자 로그 시작 등록
  • whatever/myapp/register?step=1
  • 에서
  • whatever/myapp/account/** 개인 영역 조회수 (페이지) 후 등록 프로세스를 완료하는 동안
  • whatever/myapp/pending보기 표시
  • whatever/myapp/blocked 계정 차단보기
  • whatever/myapp/register/retry 등록에 실패하면 기본적으로

을 다시 시도 llow, 다음이 URL은 사용자 인증을 필요로한다, 즉 필요-로그인 :이

  • whatever/myapp/pending (이 페이지로 리디렉션 설정 타이머를 가지고

    • whatever/myapp/account/** (개인 영역 페이지)/계정/홈)
    • whatever/myapp/register/retry

    이 교류에 매우 간단합니다 Spring 보안을 사용하여 hieve합니다. 그러나 Spring 보안을 통한 사용자 인증에 관계없이 사용자의 현재 계정 상태 (내 DB에 저장 됨)에 따라 비공개 영역 페이지에 액세스 할 수 있는지 여부를 결정해야합니다.

    사용자가 개인 영역 (/account/**)에있는 항목에 액세스하려고하면 상태에 따라 적절한보기 (적절한 페이지로 리디렉션 됨)가 표시되어야합니다. 나는 이러한 상태가 정의한 :

    • suspended - 관련보기
    • enabled 보류에 - 전체 액세스 권한을
    • disabled을 허용 - 여기
    • retry_allowed 관련이없는 -보기
    • blocked을 다시 시도 관련 - 관련 계정 차단보기

    현재 /account/**에 MVC 인터셉터를 설정하여 사용자 상태를 확인하고 적절한 페이지로 리디렉션하지만 어쨌든 여러 컨트롤러 호출과 같은 이상한 동작을 겪고 있기 때문에 이것이 이상적이거나 적절한 해결책이 아님을 알게됩니다. .. 그리고 또한 나는/falsepreHandle() 방법 안에 돌려 보낼 언제 확실하지 않다. 인터셉터의 코드 스 니펫은 다음과 같습니다.

    유효한 방법입니까? 다른 대안?

  • 답변

    21

    모든 옵션이 유효하며, 원하는 추상화 수준에 따라 다릅니다.Filter에서

    HttpServletRequestHttpServletResponse 개체에 액세스 할 수 있으므로 매우 많이 Servlet API와 결합된다. 렌더링 될 뷰 또는 ResponseEntity을 반환하는 것과 같은 훌륭한 모든 Spring 기능에 (직접적으로) 액세스 할 수 없습니다.

    HandlerInterceptor에서 다시 한 번 더 똑같습니다. ModelAndView에 액세스 할 수 없거나 postHandle()에 체크인하는 깃발을 설정하지 않은 preHandle()에서 직접 리디렉션하거나 요청을 처리 할 수 ​​있습니다. ModelAndView에 액세스 할 수 있지만 다른 Spring MVC 기능에는 액세스 할 수 없습니다.

    스프링 보안은 좋은 대안이지만 너무 많이 좋아하지 않는 구성이 많이 있습니다.

    내가 가장 마음에 드는 마지막 대안 중 하나는 AOP (Spring Security 또는 Shiro에서도이 작업을 수행 할 수 있습니다)를 사용하는 것입니다. @Private과 같은 주석을 만들고 @Controller 처리기 메서드에 주석을 추가합니다. AOP를 사용하여 이러한 방법을 조언합니다. 조언은 기본적으로 일부 세션 또는 플래그에 대한 요청 속성 (권한 있음 여부)을 확인합니다. 허용 된 경우 처리기 메서드를 계속 실행하고 그렇지 않으면 UnauthorizedException (또는 이와 비슷한 값)을 throw합니다. 그런 다음 응답을 생성하는 방법을 완전히 제어 할 수있는 예외에 대해 @ExceptionHandler을 선언합니다. ModelAndView (관련), ResponseEntity, 처리기에 @ResponseBody으로 주석을 추가하고 응답을 직접 작성하는 등의 작업을합니다. 당신이 원한다면 훨씬 더 많은 통제력을 가져야합니다.