【问题标题】:Grails and Oauth2 Spring securityGrails 和 Oauth2 Spring 安全性
【发布时间】:2012-06-15 06:50:39
【问题描述】:

我正在尝试使用基于插件 grails-spring-security-oauth2-provider 的 grails 配置广告 OAUTH2 提供程序,但已升级到 pring-Security-OAuth M6

我能够使用 /oauth/authorize 端点注册客户端并获取授权码。

但是我在尝试获取访问令牌时遇到问题,似乎无法返回json。

我用 curl 调用访问令牌端点

curl -k -i -H "Accept: application/json" "https://graph.mysite.it/oauth/token?client_id=testApp&client_secret=testAppSecret&response_type=token&grant_typization_code&code=OJD7xf&redirect_uri=https%3A%2F%2Fgraph.mysiste.it%2Fxme"

服务器回复 HttpMediaTypeNotAcceptableException 找不到可接受的表示。

在谷歌上搜索我尝试添加 resources.xml mvc:annotation-driven to 让spring注册json jackson转换器,此时调用返回HTTP/1.1 406 Not Acceptable "该请求标识的资源只能生成根据请求"accept" headers不能接受的特性的响应"

进入 spring security oauth source 我到达了这个控制器TokenEndpoint.java 在这里调试我看到令牌已正确生成。 使用 groovy 控制台,我尝试手动收集 jackson 转换器广告:

   import org.codehaus.jackson.map.ObjectMapper
   import org.springframework.security.oauth2.common.OAuth2AccessToken
   def mapper = new ObjectMapper()
   def token = new OAuth2AccessToken('fdkshdlfhklsahdklfhksaldfkl')
   mapper.writeValueAsString(token)

json 打印正确,所以我可以排除 jackson 配置中的问题。

spring mvc 控制器在 grails 中映射为

"/oauth/token"(uri:"/oauth/token.dispatch")

问题出在哪里?为什么grails不能返回json?

这是我的Dependecy report

【问题讨论】:

    标签: spring grails spring-security oauth-2.0 jackson


    【解决方案1】:

    我遇到了同样的问题,但是以这种方式在 resource.groovy 中声明了 annotationHandlerAdapter 配置并且它可以工作:

    import org.springframework.http.converter.ByteArrayHttpMessageConverter
    import org.springframework.http.converter.FormHttpMessageConverter
    import org.springframework.http.converter.StringHttpMessageConverter
    import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
    import org.springframework.http.converter.xml.SourceHttpMessageConverter
    import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
    
    beans = {
        annotationHandlerAdapter(RequestMappingHandlerAdapter){
            messageConverters = [
                    new StringHttpMessageConverter(writeAcceptCharset: false),
                    new ByteArrayHttpMessageConverter(),
                    new FormHttpMessageConverter(),
                    new SourceHttpMessageConverter(),
                    new MappingJacksonHttpMessageConverter()
            ]
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      解决了。

      在 Spring 中,转换器在 bean RequestMappingHandlerAdapter 中声明,该 bean RequestMappingHandlerAdapter 在文件 ControllersGrailsPlugin 的 grails 核心中配置。

      在resource.xml中声明无效。

      为了添加转换器,我在我的 grails 插件的 doWithSpring 方法中重新定义了 bean

      import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
      import org.springframework.http.converter.StringHttpMessageConverter
      import org.springframework.http.converter.ByteArrayHttpMessageConverter
      import org.springframework.http.converter.FormHttpMessageConverter
      import org.springframework.http.converter.xml.SourceHttpMessageConverter
      import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
      
      
      class MyGrailsPlugin {
      
      def doWithSpring = {
      annotationHandlerAdapter(RequestMappingHandlerAdapter){
                  messageConverters = [
                      new StringHttpMessageConverter(writeAcceptCharset: false),
                      new ByteArrayHttpMessageConverter(),
                      new FormHttpMessageConverter(),
                      new SourceHttpMessageConverter(),
                      new MappingJacksonHttpMessageConverter()
                      ]
                  }
      
      }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2020-07-01
        • 2017-02-09
        • 1970-01-01
        • 2015-05-22
        • 2016-04-15
        • 1970-01-01
        • 2018-09-11
        • 2017-08-06
        • 2019-12-28
        相关资源
        最近更新 更多