2014-10-27 146 views
1

我春天的安全配置:Spring Security沒有拋出任何異常

<security:http auto-config="true" use-expressions="true" > 
<security:intercept-url pattern="/game/**" access="isAuthenticated()"/> 
<security:intercept-url pattern="/**" access="permitAll"/> 

<security:form-login password-parameter="password" username-parameter="username" login-page="/" 
      default-target-url="/game/" login-processing-url="/processLogin" authentication-failure-url="/"/> 
<security:logout logout-url="/game/logout" logout-success-url="/" delete-cookies="true" invalidate-session="true"/> 
<security:access-denied-handler ref="accessDeniedHandler" /> 
</security:http> 

自定義處理:

@Component 
public class AccessDeniedHandler extends AccessDeniedHandlerImpl { 
@Override 
public void handle(HttpServletRequest request, 
        HttpServletResponse response, AccessDeniedException exception) 
     throws IOException, ServletException { 
    super.handle(request, response, exception); 
    } 
} 

異常解析器:

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
    <property name="exceptionMappings"> 
     <props> 
      <prop key=".AccessDeniedException">accessDenied</prop> 
     </props> 
    </property> 
</bean> 

我的問題是Spring Security不會拋出任何例外。例如,當我輸入受保護的網址時,它會將我重定向到登錄頁面。如果我從配置中刪除登錄頁面,它會將我重定向到彈簧安全默認登錄表單。正因爲如此,我無法處理任何異常,如AccessDeniedException。正如你上面看到的,我已經定義了自定義訪問被拒絕的處理程序,它重寫了處理方法,但它甚至沒有進入它。我也嘗試過使用SimpleMappingExceptionResolver,但那也行不通。 所以我的問題是:如何使彈簧安全性拋出異常,以便我可以通過解析器或自定義處理程序捕獲它們?

+0

'AccessDeniedHandler'僅適用於已通過身份驗證的用戶。也許如果你更詳細地解釋你想要達到的目標。爲什麼你不希望Spring Security對用戶進行身份驗證? – 2014-10-27 15:38:42

+0

嗨盧克,感謝您的信息。不知道它只適用於已通過身份驗證的用戶。我試圖做的只是顯示我的錯誤頁面,當未經身份驗證的用戶試圖訪問的東西只有身份驗證的用戶,但沒有映射到任何網址,以便用戶不能手動輸入/拒絕例如。 – Sikor 2014-10-27 15:47:41

+0

從您的問題中不清楚用戶是如何進行身份驗證的,或者您訪問網站時爲什麼不希望他們成爲用戶。如果你想覆蓋認證過程來拒絕訪問,你可以使用一個自定義的'AuthenticationEntryPoint'。默認開啓將重定向到登錄頁面。也不要使用'auto-config'。無論您是否配置它,它都會創建登錄設置。只要刪除它。 – 2014-10-27 15:53:19

回答

2

我的AccessDeniedHandler無法正常工作的原因是因爲它僅適用於經過身份驗證的用戶,所以爲了在未經身份驗證的用戶嘗試訪問經過身份驗證的用戶的東西時顯示錯誤頁面(這是爲了抓住一個AccessDeniedException),你應該寫你的定製入口點,並覆蓋默認的。

感謝盧克泰勒澄清這給我。