【问题标题】:Spring security custom exception handler with preauth具有 preauth 的 Spring 安全自定义异常处理程序
【发布时间】:2013-02-03 15:25:02
【问题描述】:

我正在尝试使用 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 的异常处理之外。如果需要,我可以提供更多代码示例,但目前我不确定要分享什么。

【问题讨论】:

  • 你能说一下是什么不工作吗?
  • @TheZuck 我已经编辑了我的问题,以便更具体地解决我的问题

标签: java spring spring-mvc spring-security


【解决方案1】:

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

【讨论】:

  • 好的,那么有 Spring Security 版本的 SimpleMappingExceptionResolver 吗?我正在尝试为某些类型的授权失败定义错误页面。
  • 我认为在 Spring Security 中没有办法做到这一点。查看 loadUserByUsername 合同。此方法只能抛出 UsernameNotFoundException。在身份验证期间没有添加权限检查的扩展点。更重要的问题是为什么要在身份验证期间检查权限?
  • 据我所知,在使用外部身份验证系统时,没有其他方法可以进行操作级别的安全检查。 stackoverflow.com/questions/14485122/…。如果有其他方法可以做到这一点,我很乐意听到。
  • 我不确定您的情况,但通常您始终可以将身份验证和授权分开。例如,您可以在控制器级别应用安全限制。打开安全注释并使用@Secured("ROLE_ACTION_1")、@Secured("ROLE_ACTION_2") 等来注释您的控制器... 选项 2:您可以使用 结构。你试过了吗?
  • 我们的应用程序需要对授权进行更精细的控制。角色不提供这些,我们需要检查单个操作/对象的用户权限。
猜你喜欢
  • 2019-12-28
  • 2015-10-18
  • 2023-03-04
  • 2022-10-19
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多