2014-02-24 71 views
0

我在Spring MVC應用程序中使用Spring Security進行用戶身份驗證。我發現了一個非常奇怪的行爲,這可能是由於我對Spring Security的錯誤配置或錯誤造成的。我需要幫助找出它是哪一個。另一個Spring安全問題

一個重要的注意事項,在任何人將此問題標記爲某個「Spring Security註銷返回按鈕」的副本之前 - 就像問題:此問題與註銷後的行爲無關。這裏的一切都發生在一次用戶會話中

所以,我有一些頁面對任何用戶都是可見的,有些頁面只對管理員可見。 home.jsp對任何用戶都是可見的,在我的spring-security.xml中是default-target-urlusers.jsp頁面(所有用戶的列表)但是假設僅對管理員可見。

現在一個簡單的場景:

  1. 啓動應用
  2. 身份登錄用戶和重定向到home.jsp頁面任何用戶都可以看到
  3. 導航頁面users.jsp只有管理員可以看到並獲得訪問被拒絕(沒事)
  4. 導航到任何其他頁面
  5. 點擊後退按鈕和users.jsp頁面出現,我甚至可以看到管理員已登錄,但我從未以管理員身份登錄,因爲它已啓動該應用程序! (我可以看到誰在使用<sec:authentication property="principal.username" />記錄在每一個JSP頁面上)

這是我spring-security.xml

<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> 

任何想法?這是一個錯誤還是我正在做一些可怕的錯誤?

+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>