2

我正在尝试使用 Spring Security 3.1.2 配置一些自定义异常处理。我尝试按照我在此处此处找到的示例进行操作,但均无效。我是 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 的异常处理之外。如果需要,我可以提供更多代码示例,但在这一点上,我不确定什么是相关的分享。

4

1 回答 1

2

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

于 2013-02-04T10:10:16.643 回答