簡體   English   中英

Grails和Oauth2 Spring安全性

[英]Grails and Oauth2 Spring security

我正在嘗試基於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以讓spring注冊json jackson轉換器,這時的HTTP / 1.1調用返回406 Not Acceptable“此請求標識的資源僅能夠生成響應具有根據請求“接受”標頭不可接受的特征”

進入春季安全oauth源,我到達了此控制器TokenEndpoint.java。在這里調試時,我看到令牌已正確生成。 我已經使用groovy控制台嘗試手動整理傑克遜轉換器廣告,並且效果良好:

   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報告

我遇到了同樣的問題,但是以這種方式在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()
        ]
    }

}

解決了。

在Spring中,轉換器是在bean RequestMappingHandlerAdapter中聲明的,該bean是在文件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()
                ]
            }

}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM