具有preauth的Spring安全性自定义异常处理程序

时间:2013-02-03 15:25:03

标签: java spring spring-mvc spring-security

我正在尝试使用Spring Security 3.1.2配置一些自定义异常处理。我尝试按照我找到herehere的示例进行操作,但都不起作用。我是Spring Security的新手,我想知道这是否与我使用preauth过滤器的事实有关。我正在从AuthenticationUserDetailsS​​ervice实现的loadUserDetails()方法中抛出自定义异常。

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的异常处理之外。如果需要,我可以提供更多代码示例,但此时我不确定与分享相关的内容。

1 个答案:

答案 0 :(得分:1)

您使用 SimpleMappingExceptionResolver 。它是一个Spring MVC组件。因此,当您在执行某些控制器时遇到异常时,DispatcherServlet将调用SimpleMappingExceptionResolver。 问题是您的AuthenticationUserDetailsS​​ervice实现仅在登录操作期间使用。并且此操作直接由Spring Security过滤器处理(不使用Spring MVC)。请求不会到达DispatcherServlet,并且在这种情况下永远不会调用SimpleMappingExceptionResolver。