2015-06-05 32 views
1

我春天的安全配置是Spring Security的顯示404,如果用戶沒有授權

<http pattern="/resources/**" security="none"/> 
    <http pattern="/login**" security="none"/> 
    <http pattern="/invalidsession**" security="none"/> 
    <http pattern="/forgotpassword**" security="none"/> 
    <http pattern="/accessdenied**" security="none"/> 
    <http auto-config="true" use-expressions="true"> 
     <intercept-url pattern="/common/**" access="hasAnyRole('SITE_ADMIN','CLIENT_ADMIN')" /> 
     <intercept-url pattern="/site/**" access="hasRole('SITE_ADMIN')" /> 
     <intercept-url pattern="/**" access="hasRole('CLIENT_ADMIN')" /> 
     <!-- access denied page 
     <access-denied-handler error-page="/accessdenied" /> 
     --> 
     <access-denied-handler ref="my403" /> 
     <form-login login-page="/login" 
      username-parameter="username" 
      password-parameter="password" authentication-failure-url="/login?error" 
      authentication-success-handler-ref="myAuthenticationSuccessHandler" 
      /> 
     <logout logout-success-url="/login?logout" /> 
     <session-management invalid-session-url="/invalidsession" /> 
    </http> 

當SITE_ADMIN用戶打開不存在的頁面,然後它顯示拒絕訪問頁面,而不是404頁。這是因爲<intercept-url pattern="/**" access="hasRole('CLIENT_ADMIN')" />。 Spring未在pagenotfound之前檢查授權。如果頁面不存在並且SITE_ADMIN當前正在記錄,我該如何顯示404。

回答

1

不知道爲什麼你要這樣,但你可以通過實現AuthenticationEntryPoint完成它,並有commence method set 404CLIENT_ADMIN並保留默認其他人

@Component 
    public class EntryPointUnauthorizedHandler implements AuthenticationEntryPoint{ 
      @Override 
public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,AuthenticationException e) throws IOException, ServletException { 
    // use SecurityContextHolder.getContext() for your security checks 
    httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED,"Access Denied"); 
       } 

      } 

現在你可以添加http安全配置中的入口點

1

這個要求將很難實現:Spring安全過濾器進行網絡授權測試之前調度程序servlet已經看到了請求。

那麼可以做些什麼?這裏有一些路徑,但我從來沒有嘗試過任何一個。

1 /使用自定義AccessDeniedHandler。其處理方法將獲得請求和響應,因此它可以嘗試通過虛擬響應將它們直接傳遞給DispatcherServlet。最難的部分是分析響應以查看它是否是404錯誤頁面,如果它是在實際響應中複製虛擬響應,則使用默認的AccessDeniedHandlerImpl方法。看起來很樸素......

2放棄網絡安全,只在所有服務方法上使用方法安全性。這樣,只有在DispatcherServlet成功找到請求的控制器時纔會調用安全性。它的缺點是您將無法獲得靜態頁面的安全性。但這種方式如果更多春天的方式

無論如何,我永遠不會試圖這樣做。我不允許某人進入特定的層次結構,我不希望他確切地知道存在哪些頁面。我並不是特別喜歡模糊處理的安全性,但我優先考慮隱藏對用戶不直接有用的所有內容。

+0

感謝您的評論。我告訴過我的經理,他說不要這樣做。 –