Grails和Oauth2 Spring安全

时间:2012-06-12 11:34:57

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

我想使用基于插件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无法找到可接受的表示。

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

进入spring security oauth source我到达了这个控制器TokenEndpoint.java 在这里调试我看到令牌已正确生成。 使用groovy控制台我尝试手动colling 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 /令牌”(URI: “/ OAuth的/ token.dispatch”)

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

这是我的Dependecy report

2 个答案:

答案 0 :(得分: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()
        ]
    }

}

答案 1 :(得分:0)

解决。

在Spring中,转换器在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()
                ]
            }

}

}