2013-02-03 50 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