3

Oauth for SpringSecurityに基づくOauth2クライアントをプレーンなJava/SpringからGrailsに移植しようとしていますが、問題が発生しました。問題の核心は、Spring Oauthクライアント実装の設計が、Oauth2RestTemplateからスローされた例外がOAuth2ClientContextFilterのcatchブロックでキャッチされるという仮定に依存しているため、フィルターがリダイレクト応答を発行できるようにすることです。 (宣誓プロバイダーに承認要求を送信するため)。

これはプレーンなJava/Springでは正常に機能しますが、Grailsでは、GrailsDispatcherServletはHandlerExceptionResolversを介してすべての例外を処理するように構成されています。したがって、Oauth2RestTemplateでスローされた例外(Grailsコントローラー内で呼び出される)はGrailsExceptionResolverによってキャッチされ、OAuth2ClientContextFilterによって認識されることはないため、目的のリダイレクト動作が無効になります。

Grailsの例外処理をカスタマイズすることについて私が見つけたすべての議論は、カスタマイズの目的が例外をHTTPエラーコードまたはエラーページビューにマップすることであると想定しているようです。しかし、特定の例外が未処理のまま流れるようにするようにGrailsに指示して、サーブレットフィルターでキャッチできるようにする方法はありますか?または、ModelAndViewを返すのではなく(HandlerExceptionResolverの標準的な期待値のように)、例外を再スローするカスタムHandlerExceptionResolverを挿入することは可能ですか?または、Grails内でOauth for Spring Securityクライアントを機能させるためのより良い方法は他にありますか?

4

2 に答える 2

1

これが私が最終的に思いついたものです。それが最善の解決策であるかどうかはわかりませんが、うまくいくようです:

  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を実行し、デフォルトのGrailsDispatcherServletの代わりにMyDispatcherServletを使用するようにweb.xmlを変更します

その結果、MyDispatcherServletはUserRedirectRequiredExceptionを含む例外を再スローして、OAuth2ClientContextFilterでキャッチできるようにしますが、他の例外は、GrailsExceptionResolverによって以前と同じように渡されて処理されます。

于 2012-07-03T15:32:58.273 に答える
1

カスタム例外リゾルバーを定義することexceptionHandlerで宣言できると思います。resources.groovyこのカスタム例外リゾルバーは、(オプションで)GrailsExceptionResolverをオーバーライドできます。

exceptionHandler(MyExceptionResolver) {
    exceptionMappings = ['java.lang.Exception': '/error']
}

class MyExceptionResolver extends GrailsExceptionResolver {
     @Override
     ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, 
      Object    handler, Exception ex) {
     //your custom code
     return super.resolveException(request, response, handler, ex)
    }
}
于 2014-08-11T14:04:05.060 に答える