gpt4 book ai didi

spring - 如何绕过 Grails 异常处理以使用 Spring Oauth2?

转载 作者:行者123 更新时间:2023-12-02 06:37:13 26 4
gpt4 key购买 nike

我正在尝试将基于 Oauth for Spring Security 的 Oauth2 客户端从普通 Java/Spring 移植到 Grails,但遇到了问题。问题的关键似乎在于 Spring Oauth 客户端实现的设计依赖于这样的假设:从 Oauth2RestTemplate 抛出的异常将被 OAuth2ClientContextFilter 的 catch block 捕获,从而允许过滤器发出重定向响应(向宣誓提供者发送授权请求)。

这在普通 Java/Spring 中工作得很好,但在 Grails 中,GrailsDispatcherServlet 配置为通过 HandlerExceptionResolvers 处理所有异常。因此,Oauth2RestTemplate 中抛出的异常(在 Grails Controller 内部调用)被 GrailsExceptionResolver 捕获,并且 OAuth2ClientContextFilter 永远不会看到,从而破坏了所需的重定向行为。

我发现的所有关于自定义 Grails 异常处理的讨论似乎都假设自定义的目的是将异常映射到 HTTP 错误代码或错误页面 View 。但是有没有办法告诉 Grails 简单地允许特定异常未经处理地流过,以便 servlet 过滤器可以捕获它?或者是否可以插入一个自定义的 HandlerExceptionResolver 来重新抛出异常而不是返回 ModelAndView(这是 HandlerExceptionResolver 的标准期望)?或者是否有其他更好的方法让 Oauth for Spring Security 客户端在 Grails 中工作?

最佳答案

这就是我最终想到的。不确定这是否是最好的解决方案,但它似乎有效:

  1. 创建一个新的 MyDispatcherServlet.groovy:

    package org.example.com

    import org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet
    import javax.servlet.http.HttpServletRequest
    import javax.servlet.http.HttpServletResponse
    import org.springframework.web.servlet.ModelAndView
    import org.springframework.security.oauth2.client.UserRedirectRequiredException

    class MyDispatcherServlet extends GrailsDispatcherServlet {

    @Override
    protected ModelAndView processHandlerException(HttpServletRequest request,
    HttpServletResponse response, Object handler, Exception ex) throws Exception {
    def e = ex
    while (e) {
    if (e instanceof UserRedirectRequiredException) {
    throw ex
    }
    e = e.cause
    }
    return super.processHandlerException(request, response, handler, ex)
    }
    }
  2. 运行 grails install-templates 并修改 web.xml 以使用 MyDispatcherServlet 而不是默认的 GrailsDispatcherServlet

结果是 MyDispatcherServlet 将重新抛出一个包含 UserRedirectRequiredException 的异常,以便它可以被 OAuth2ClientContextFilter 捕获,但其他异常将像以前一样由 GrailsExceptionResolver 传递和处理。

关于spring - 如何绕过 Grails 异常处理以使用 Spring Oauth2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11261914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com