2013-02-03 100 views
1

我想用Spring Security 3.1.2配置一些自定義異常處理。我試着按照我發現的例子herehere,但都不起作用。我是Spring Security的新手,我想知道這是否與我使用預過濾器的事實有關。我從我的AuthenticationUserDetailsS​​ervice實現的loadUserDetails()方法中拋出自定義異常。彈出安全性自定義異常處理程序preauth

public class AuthServiceImpl implements AuthenticationUserDetailsService<Authentication> { 
    @Autowired 
    private AuthDao authDao; 

    @Override 
    public UserDetails loadUserDetails(Authentication auth) throws UsernameNotFoundException { 
    Request req = (Request) auth.getPrincipal(); 

    //get user details 
    User u = authDao.loadUser(req.getSessionId()); 

    //check user rights for requested action 
    if(!u.getRights().contains(req.getAction()){ 
     throw new CustomAuthException("User does not have permission to perform this action"); 
    } 

    return u; 
    } 
} 

當引發異常時,我只是得到了正常的Tomcat 500頁面的例外細節。無論出於何種原因,我的自定義例外都沒有得到處理。我甚至在自定義處理程序中添加了一些println(),它甚至沒有被調用。

我開始懷疑這個方法是否被排除在Spring的異常處理之外。如果需要,我可以提供更多的代碼示例,但在這一點上,我不確定分享的相關內容。

+0

你能說什麼不準確嗎? – TheZuck

+0

@TheZuck我編輯了我的問題,以更具體地處理我的問題 – monitorjbl

回答

1

您使用SimpleMappingExceptionResolver。它是一個Spring MVC組件。所以當你在執行一些控制器的時候有一些異常,那麼DispatcherServlet會調用SimpleMappingExceptionResolver。 問題是您的AuthenticationUserDetailsS​​ervice實現僅在登錄操作期間使用。而這個動作是直接使用Spring Security過濾器處理的(不使用Spring MVC)。請求未達到DispatcherServlet,SimpleMappingExceptionResolver永遠不會被調用。

+0

好吧,SimpleMappingExceptionResolver的Spring Security版本也有嗎?我試圖爲特定類型的授權失敗定義錯誤頁面。 – monitorjbl

+0

我認爲在Spring Security中沒有辦法做到這一點。看看** loadUserByUsername **合同。此方法只能拋出UsernameNotFoundException。在認證過程中沒有擴展點來添加權限檢查。更重要的問題是您爲什麼要在驗證過程中檢查權限? –

+0

據我所知,在使用外部認證系統時,沒有其他方式可以執行操作級別的安全檢查。 http://stackoverflow.com/questions/14485122/spring-security-authorization-via-get-parameters。如果還有其他方法可以做到這一點,我很樂意聽到它。 – monitorjbl