java - 带预身份验证的 Spring Security 自定义异常处理程序

标签 java spring spring-mvc spring-security

我正在尝试使用 Spring Security 3.1.2 配置一些自定义异常处理。我尝试按照我发现的示例 herehere ,但两者都不起作用。我是 Spring Security 的新手,我想知道这是否与我使用预身份验证过滤器有关。我从 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 的异常处理之外。如果需要,我可以提供更多代码示例,但目前我不确定哪些内容值得分享。

最佳答案

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

关于java - 带预身份验证的 Spring Security 自定义异常处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14674021/

相关文章:

java - 静态方法以及如何使用它们

c# - [A]MySql.Data.MySqlClient.MySqlConnection 无法转换为 [B]MySql.Data.MySqlClient.MySqlConnection

java - 使用 Apache Flink 1.10 的 Azure Blob 存储

java - @RequestMapping 与 "params"在不同类中的相同 URL 导致 "IllegalStateException: Cannot map handler"在 JUnit 与 SpringJUnit4ClassRunner

java - 为什么 JSON pretty-print 不起作用?

web-services - Spring、Jackson 和自定义(例如 CustomDeserializer)

java - Jasypt加密-加密时删除斜杠

java - Junit测试spring Controller mockMvc @ContextConfiguration

java - 如何在 Java 中重置/清除 JRadioButton

java - 基于 Spring 的单个 ehcache 管理器,用于多模块项目中的多个 ehcache.xml 文件