2014-02-24 3 views
0

스프링 MVC 애플리케이션에서 사용자 인증을 위해 스프링 보안을 사용하고 있습니다. 스프링 보안의 잘못된 구성 또는 버그로 인한 것일 수있는 매우 이상한 행동을 발견했습니다. 어느 것이 있는지 알아내는 데 도움이 필요합니다.또 다른 스프링 보안 문제

누군가가이 질문을 "스프링 보안 로그 아웃 뒤로 버튼"과 같은 질문으로 표시하기 전에 한 가지 중요한 점은이 문제는 로그 아웃 후 동작과 아무런 관련이 없음을 의미합니다. 모든 것은 여기에 하나의 사용자 세션 동안 발생합니다!

그래서 모든 사용자에게 표시되는 페이지와 관리자에게만 표시되는 페이지가 있습니다. home.jsp은 모든 사용자에게 표시되며 내 spring-security.xmldefault-target-url입니다. users.jsp 페이지 (모든 사용자 목록)는 admin에게만 표시되는 것으로 가정합니다.

이제 간단한 시나리오 :

  1. 같은 사용자에서 응용 프로그램을
  2. 로그를 시작하고 users.jsp 단지 관리자가보고 얻을 수있는 모든 사용자가 페이지로
  3. 이동을 볼 수 있습니다 home.jsp 페이지로 리디렉션 액세스가 거부되었습니다 (괜찮습니다)
  4. 다른 페이지로 이동
  5. 뒤로 버튼과 users.jsp 페이지가 나타나고 관리자가 로그인되어있는 것을 볼 수도 있지만 앱을 시작한 이후 관리자로 로그인 한 적이 없습니다 !!!

    <http auto-config="true" use-expressions="true"> 
        <intercept-url pattern="/essays/auth/login" access="permitAll"/> 
        <intercept-url pattern="/essays/auth/logout" access="permitAll"/> 
        <intercept-url pattern="/essays/auth/denied" access="hasRole('ROLE_USER')"/> 
        <intercept-url pattern="/" access="hasRole('ROLE_USER')"/> 
        <intercept-url pattern="/essays/main/user/home" access="hasRole('ROLE_USER')"/> 
        <intercept-url pattern="/essays/main/user/list" access="hasRole('ROLE_ADMIN')"/> 
        <intercept-url pattern="/essays/main/user/add" access="hasRole('ROLE_ADMIN')"/> 
        <intercept-url pattern="/essays/main/user/{userId}/edit" access="hasRole('ROLE_ADMIN')"/> 
        <intercept-url pattern="/essays/main/user/delete" access="hasRole('ROLE_ADMIN')"/> 
    
        <form-login login-page="/essays/auth/login" 
           authentication-failure-url="/essays/auth/login?error=true" 
           default-target-url="/essays/main/user/home" 
           always-use-default-target="true"/> 
    
        <access-denied-handler error-page="/essays/auth/denied"/> 
    
        <logout invalidate-session="true" 
          logout-success-url="/essays/auth/login" 
          logout-url="/essays/auth/logout"/> 
    </http> 
    
    <authentication-manager> 
        <authentication-provider user-service-ref="customUserDetailsService"> 
         <password-encoder hash="md5"/> 
        </authentication-provider> 
    </authentication-manager> 
    

    어떤 아이디어 :

이 내 spring-security.xml이다 (I는 <sec:authentication property="principal.username" />를 사용하여 모든 JSP 페이지에 누가 로그인있어 볼 수 있습니다)? 이 버그입니까? 아니면 끔찍한 일을하고있는 중입니까?

+1

. 그런 다음 다시 시도하십시오. 문제가 지속되면, 지정한 전체 플로우에 대해 Spring Security 로그를 첨부하십시오. –

+0

캐시를 지우면 문제가 해결되었습니다. 이제 나는 바보 같아. 정말 고맙습니다. –

+0

@RobWinch 제발, 내가 그것을 받아 들일 수 있도록 대답 해주세요. 어쩌면 그것은 프로그래밍을 배우는 데 어려움을 겪고있는 다른 누군가를 도울 것입니다. –

답변

1

문제는 페이지를 캐싱했기 때문에 발생합니다. 당신이 headers element 사용 스프링 시큐리티 3.2 이상를 사용하는 경우는 쉽게 방지 할 수 있습니다 : 캐시를 삭제하여 시작하십시오

<http auto-config="true" use-expressions="true"> 
    <intercept-url pattern="/essays/auth/login" access="permitAll"/> 
    <intercept-url pattern="/essays/auth/logout" access="permitAll"/> 
    <intercept-url pattern="/essays/auth/denied" access="hasRole('ROLE_USER')"/> 
    <intercept-url pattern="/" access="hasRole('ROLE_USER')"/> 
    <intercept-url pattern="/essays/main/user/home" access="hasRole('ROLE_USER')"/> 
    <intercept-url pattern="/essays/main/user/list" access="hasRole('ROLE_ADMIN')"/> 
    <intercept-url pattern="/essays/main/user/add" access="hasRole('ROLE_ADMIN')"/> 
    <intercept-url pattern="/essays/main/user/{userId}/edit" access="hasRole('ROLE_ADMIN')"/> 
    <intercept-url pattern="/essays/main/user/delete" access="hasRole('ROLE_ADMIN')"/> 

    <headers /> 

    <form-login login-page="/essays/auth/login" 
       authentication-failure-url="/essays/auth/login?error=true" 
       default-target-url="/essays/main/user/home" 
       always-use-default-target="true"/> 

    <access-denied-handler error-page="/essays/auth/denied"/> 

    <logout invalidate-session="true" 
      logout-success-url="/essays/auth/login" 
      logout-url="/essays/auth/logout"/> 
</http>