spring-security - 如何在 OAuth2RestTemplate 中更改 MappingJacksonHttpMessageConverter 的 MediaType

标签 spring-security oauth-2.0 jackson resttemplate

我有一个应用程序使用 Spring Source OAuth2 作为客户端从资源服务器检索用户数据并创建本地用户。当 OAuth2ClientContextFilter 尝试检索 token 时,我不断收到错误消息:

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [org.springframework.security.oauth2.common.OAuth2AccessToken] and content type [application/x-javascript;charset=utf-8]

我知道默认的 MediaType 是“application/json”,所以我尝试像这样自定义 MappingJacksonHttpMessageConverter:

<bean id="jacksonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <bean class="org.springframework.http.MediaType">
                    <constructor-arg value="application"/>
                    <constructor-arg value="x-javascript"/>
                    <constructor-arg value="UTF-8"/>
                </bean>
            </list>
     </property>
</bean>

我还尝试了应该支持 */* 的“ALL”构造函数参数内容类型但没有运气。参见 http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/http/MediaType.html

其他重要信息是我现在使用的是全 XML 配置。我刚刚将我们的 2.5 应用程序升级到 3.1.1。我在 spring security PRE_AUTH 过滤器中使用 OAuth2RestTemplate,而不是在 Controller 中。所以我没有使用注释来映射其余调用。我试过添加 <context:annotation-config/>但这并没有什么不同。

我只是从我的自定义 AbstractPreAuthenticatedProcessingFilter 调用我的 OAuth 服务 bean。当服务 bean 尝试对用户数据执行其余调用时,将抛出异常,触发 OAuth2ClientContextFilter 尝试检索 token 。这是我的 OAuth2 服务 bean 配置:

<bean id="reprintsOauthService" class="com.coral.user.ReprintsOauthService">
    <property name="reprintsUserInfoUrl" value="https://www.demo.com/api/userinfo.ashx" />
    <property name="reprintsRestTemplate">
        <bean class="org.springframework.security.oauth2.client.OAuth2RestTemplate">
            <constructor-arg ref="reprintsResource"/>
            <property name="messageConverters">
                <list>
                   <ref bean="jacksonConverter"/>
                </list>
            </property>
        </bean>
    </property>
</bean> 

我错过了什么吗?为什么 Jackson 不映射响应?

最佳答案

已修复!问题在于 OAuth2RestTemplate 未用于 token 检索。所以我必须自定义 org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport 并将 MappingJacksonHttpMessageConverter 添加到现有方法中,如下所示:

  public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
    this.messageConverters = new ArrayList<HttpMessageConverter<?>>(messageConverters);
    this.messageConverters.add(new FormOAuth2AccessTokenMessageConverter());
    this.messageConverters.add(new FormOAuth2ExceptionHttpMessageConverter());

    MappingJacksonHttpMessageConverter jackson = new MappingJacksonHttpMessageConverter();
    List<MediaType> mediaTypes = new ArrayList<MediaType>();
    mediaTypes.add(new MediaType("application", "x-javascript"));
    jackson.setSupportedMediaTypes(mediaTypes);
    this.messageConverters.add(jackson);

    if(logger.isDebugEnabled())
    {
        logger.debug("*** Added custom media type 'application/x-javascript' to the Jackson converter");
    }
}

关于spring-security - 如何在 OAuth2RestTemplate 中更改 MappingJacksonHttpMessageConverter 的 MediaType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9854855/

相关文章:

kotlin - 如何一般地使用泛型反序列化Jackson容器

java - 具有用户名和 ID 的 Spring Security RememberMe 函数

java - Spring 启动安全: Custom login page is never authenticating

java - HttpClient 发布以从 keycloak 获取 Bearer token

oauth-2.0 - 您如何强制使 salesforce 访问 token 过期?

spring - 使用 spring、jackson 格式化 LocalDateTime

java - com.fasterxml.jackson.core.JsonGenerationException : Can not write a field name, 期待一个值

java - spring oauth2sso 是如何工作的?为什么会发生这个重定向序列?

javascript - 使用 javascript 获取谷歌联系人

json - 使用 lombok 自定义序列化和反序列化字段名称