2013-01-20 68 views
4

我有一個異常處理程序設置與下面的代碼春天@ExceptionHandler不趕AccessDeniedException異常

@ExceptionHandler(Throwable.class) 
public @ResponseBody CustomResponse handleException(Throwable throwable){ 
    // handles exception, returns a JSON 
} 

我使用的Spring Security 3.1。當我嘗試在沒有身份驗證的情況下執行操作時,應用程序拋出一個AccessDeniedException。它從來沒有涉及到這種方法。但與其他例外情況正常工作。它應該如何運作?或者我的代碼有問題嗎?

This看起來像一個解決方案。但如果我能在一個點上處理例外情況會更好。

這裏是我的配置文件

<global-method-security secured-annotations="enabled" pre-post-annotations="enabled" /> 
<http auto-config="true" use-expressions="true"> 
    //intercept urls 
    <form-login login-page="/signin" default-target-url="/" always-use-default-target="true"/> 
</http> 

<authentication-manager> 
    <authentication-provider user-service-ref="userDetailsService"> 
     <password-encoder ref="encoder" /> 
    </authentication-provider> 
</authentication-manager> 

<!-- This encoder doesn't require a salt --> 
<beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" /> 

UPDATE

在這裏,用戶沒有通過驗證(ROLE_ANONYMOUS)。當我嘗試訪問受保護的頁面時,它會將我重定向到登錄URL。我的問題在於,我做了一個AJAX調用。因此重定向到返回ModelAndView的方法不起作用。這裏有工作嗎?

回答

9

Spring Security的請求處理全部發生在調用servlet之前的過濾器鏈中,所以它不知道任何有關Spring MVC異常處理程序的信息,實際上,可以在沒有Spring MVC的情況下使用它。

對於未經身份驗證的用戶,您所看到的是expected behaviour,但您不希望將Ajax調用重定向到UI代碼。很難確切地說出最好的解決方案,因爲你不希望這種行爲對未經認證的ajax調用是什麼。例如,如果您希望它們僅以403失敗,那麼您可以將ajax API分離爲單獨的過濾器鏈。例如,如果你的Ajax調用是/ajaxapi可以在現有的前添加下列鏈的定義:

<http pattern="/ajaxapi/**" create-session="never" use-expressions="true" entry-point-ref="entryPoint"> 
    <intercept-url pattern="/**" access="isAuthenticated()" /> 
</http> 

<bean entryPoint="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint" /> 

Ajax調用都會然後就得到了403響應,直到通過瀏覽器接口驗證的用戶。

+0

謝謝你明白了。我想做我所做的其他所有例外,即返回一個JSON響應。有沒有辦法在AccessDeniedHandler中做類似的事情? – shazinltc

+0

您可以編寫一個自定義'AuthenticationEntryPoint'並將其用在上面的代碼片段中。使用'Http403ForbiddenEntryPoint'作爲起點。 –

+0

明白了:)我不必編寫自定義的AuthenticationEntryPoint。一個簡單的403響應就足夠了。謝謝btw。 – shazinltc

1

我想你在你的spring安全配置中定義了一個<access-denied-handler>。這位經理正在趕上AccessDeniedException。 這可能是爲什麼你不能在你的通用ExceptionHandler中得到它。

有一個默認的AccessDeniedHandler(附帶默認彈簧安全設置)。請閱讀this瞭解更多詳情。

+0

不,我還沒有定義任何 – shazinltc

+0

@shazinltc剛剛編輯我的帖子 – ben75

+0

我認爲,當用戶已經通過身份驗證,然後他正在訪問他不應該的東西時調用。那不是我的情況。我做了更新。 – shazinltc