2

나는이 JSF 봄 보안에 시간 제한 다음과 같은 문제 : 사용자가 invalidSessionUrl로 리디렉션되도록 요청 된 페이지가 고정 만하면 내가 sessionmanagement 필터를 정의했습니다JSF 봄 보안 세션 시간 초과 viewExpiredException

(즉, 인증 된 사용자에게만 허용 된 경우). 나는 스프링 시큐리티가 제공하는 세션 관리 필터에 넣어 사용자 정의 코드는 다음과 같습니다

if (invalidSessionUrl != null) { 
    String pagSolicitada = UtilSpringSecurity.extraerPagina(request); 
    if (UtilSpringSecurity.paginaAutenticada(pagSolicitada)) { 
      request.getSession(); 
      redirectStrategy.sendRedirect(request, response, invalidSessionUrl); 
      return; 
    } 
    //the requested page doesn't require the user to be authenticated 
    //so i just skip this filter and continue with the filter chain 
    chain.doFilter(request, response); 
    return; 
} 

방법은 "UtilSpringSecurity.extraerPagina (요청)는"요청 된 페이지를 반환이 방법 :

public static String extraerPagina (HttpServletRequest request) { 
    String uri = request.getRequestURI().toLowerCase(); 
    String cPath = request.getContextPath().toLowerCase(); 
    // uri = cPath + pagina 
    int longCPath = cPath.length(); 
    String pagina = uri.substring(longCPath); 
    return pagina; 
} 

그리고 방법 "UtilSpringSecurity.paginaAutenticada (pagSolicitada)"는 매개 변수가 사용자를 인증해야하는 페이지 인 경우 true를 반환합니다 (나는 access="isAuthenticated()" 속성을 갖는 XML 보안 설정 파일의 intercept-url 요소를 고려하여 IF를 사용하여 검사합니다) :

public static boolean paginaAutenticada (String pagina) { 

    if (pagina.startsWith("/faces/paginas/administracion/") || pagina.startsWith("/faces/paginas/barco/")) { 
      return true; 
    } 
    return false; 
} 

이 솔루션은 작동하지만, 그것은 단지 하나의 문제가있다 : 나는 세션 제한 시간이 만료 될 때까지 페이지에서 대기 체류 브라우저를두면

을하고 난 후, 나는 "viewExpiredException를 얻을, 같은 페이지를 요청 ". 이것은 필터가 잘 작동했기 때문에 invalidSessionUrl로 리다이렉션을 건너 뛰었지 만 세션이 만료 되었기 때문에 같은 페이지를 다시 렌더링하려고하는 예외가 발생합니다.

세션 제한 시간이 만료되었을 때 다른 보안되지 않은 페이지를 요청하면 제대로 작동하고 페이지로 올바르게 리디렉션되며 viewExpiredException을받지 못합니다.

누구든지이 문제를 어떻게 해결할 수 있는지 알고 있습니까?

미리 감사드립니다.

+0

'invalidSessionUrl 로의 리다이렉션을 건너 뛰었지 만 세션이 만료되었으므로 동일한 페이지를 다시 렌더링하려고하는 예외가 발생합니다. '나는 이것이 무엇을 의미하는지 이해하지 못합니다. invalidSessionUrl을 다시 렌더링 할 때 ViewExpiredException이 발생한다고 말하는 것입니까? –

+0

왜 자신 만의 세션 관리 필터를 작성하고 있습니까? 스프링 보안은이 기능을 즉시 사용할 수있게합니다. 다음을 Spring XML 설정에 추가하십시오. ... ' –

+0

첫 번째 코멘트에 답하십시오 : 'invalidSessionUrl에 리다이렉션을 건너 뛰었지 만 세션이 만료되었으므로 같은 페이지를 다시 렌더링하려고 시도합니다.' 타임 아웃이 발생했을 때 브라우저가 보여주고있는 보안되지 않은 페이지를 다시 렌더링하면 "viewExpiredException"이 발생합니다. 이것은 세션이 만기 되었기 때문에 JSF가 페이지 뷰를 빌드 할 수 없기 때문에 발생합니다. Spring Security는 페이지가 안전하지 않기 때문에 세션 관리 필터를 건너 뛰지 만, JSF가 페이지를 다시 렌더링하려고 시도 할 때 예외를 throw합니다. – choquero70

답변

0

마지막으로 해결했습니다. 이것은 JSF 문제이며 Spring Security와는 관련이 없습니다.

내가 JSF의 restoreView 방법이 방법 오버라이드 (override) 한

: 이제

@Override 
public UIViewRoot restoreView(FacesContext facesContext, String viewId) { 
    UIViewRoot root = wrapped.restoreView(facesContext, viewId); 
    if(root == null) { 
      root = createView(facesContext, viewId); 
    } 
    return root; 
} 

을 문제 페이지 매개 변수가 있다면, 나는 최근에 만들어진보기로 게시물을 할 때 내가 그들을 잃었지만, 그건이다 JSF를 다시 다루는 또 다른 뚜렷한 문제 (PRG 패턴).

3

봄 보안은 인증되지 않은 사용자에 대한 페이지 집합에 익명 액세스를 제공해야합니다. 아래는 XML 구성의 발췌 부분입니다.

<http auto-config="true" access-denied-page="/unauthorized.xhtml" > 
    <intercept-url pattern="/admin/**" access="ROLE_ADMIN" /> 
    <intercept-url pattern="/app/**" access="ROLE_USER,ROLE_ADMIN" /> 
    <intercept-url pattern="/*.xhtml" access="IS_AUTHENTICATED_ANONYMOUSLY" /> 
    <form-login login-page="/login.xhtml" login-processing-url="/j_spring_security_check" 
     authentication-success-handler-ref="authenticationSuccessBean" 
     authentication-failure-handler-ref="authenticationFailureBean" /> 
    <session-management invalid-session-url="/login.xhtml" > 
    </session-management> 
</http> 

나는 본질적으로 특정 상대 컨텍스트 내의 페이지는 다음과 같은 역할에 액세스 할 수 있다고 주장하는 intercept-url 태그를 사용합니다. 익명 사용자가 웹 응용 프로그램 기본 컨텍스트의 모든 페이지를 사용할 수 있음을 알 수 있습니다. 사용자가 페이지를 볼 권한이없는 경우 access-denied-page으로 리디렉션됩니다.

사용자 빈이 UserDetails 인터페이스를 구현하고 GrantedAuthority 인터페이스를 구현하는 역할 빈을 리턴하는 특성이 있어야한다는 것이 유일한 캐치입니다. Spring은 UserDetails에 대해 GrantedAuthority 속성을 가지고 역할이 무엇인지 결정할 것입니다. 이 사용자가 존재하지 않거나 인증되지 않았거나 알 수없는 경우 익명 역할을 기본값으로 사용합니다.

+0

나는 네가하는 말을 알고 있지만, 내가 바라는 것이 아니다. 시나리오를 참조하면 액세스 속성이 "IS_AUTHENTICATED_ANONYMOUSLY"인 페이지를 요청하면 세션이 시간 초과 될 때 sesion-management-filter가 invali-session-url로 모든 사용자 (즉, 모든 페이지)를 리디렉션합니다 "/*.xhtml"패턴과 일치하고 admin 또는 app 디렉토리에없는 사용자). 하지만 내가 원하는 것은 invalid-session-url로 리디렉션되지 않습니다. 세션이 시간 초과되지 않은 것처럼 요청한 페이지를 표시합니다 (즉,이 경우 세션 관리 필터를 적용하지 않음) – choquero70