Spring Security OAuth2更改JSON错误响应格式

时间:2015-12-30 12:45:08

标签: java spring spring-security spring-security-oauth2

我有一个基于Spring Security OAuth2的RESTful应用程序。我一直在尝试将默认的Spring Security消息传递格式从XML更改为JSON,并且已经取得了部分成功。

例如 - 我想出了当请求不包含Bearer令牌时如何更改响应格式(以下行代码)

<bean id="oauthAuthenticationEntryPoint" class ="c.s.m.security.CustomAuthenticationEntryPoint" />

但我无法弄清楚如何捕捉/更改以下两项的格式。

  1. 当在安全URL中传递无效令牌时,Spring Security当前会返回。我在哪里更改此格式?

    {"error": "invalid_token","error_description": "Invalid access token: 144285e3-9563-420e-8ce"}
    
  2. 如何更改BadCredentialsException JSON格式?目前,它返回类似于上面的JSON?

  3. 以下是我的applicationContext.xml

    <sec:http pattern="/oauth/token" create-session="stateless"
        use-expressions="true" authentication-manager-ref="authenticationManager">
        <sec:csrf disabled="true" />
        <sec:anonymous enabled="false" />
        <sec:http-basic entry-point-ref="clientAuthenticationEntryPoint" />
        <sec:custom-filter ref="clientCredentialsTokenEndpointFilter" before="BASIC_AUTH_FILTER" />
        <sec:access-denied-handler ref="oauthAccessDeniedHandler" />
    </sec:http>
    <sec:authentication-manager alias="authenticationManager"
        erase-credentials="false">
        <sec:authentication-provider user-service-ref="clientDetailsUserService" />
    </sec:authentication-manager>
    
    <bean id="clientDetailsUserService" class="org.springframework.security.oauth2.provider.client.ClientDetailsUserDetailsService">
        <constructor-arg ref="clientDetails" />
    </bean>
    
    <!-- Entry point - Entry point Filter for token server -->
    
    <bean id="clientAuthenticationEntryPoint" class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
        <property name="realmName" value="Oauth 2 security" />
        <property name="typeName" value="Basic" />
    </bean>
    
    <bean id="clientCredentialsTokenEndpointFilter" class="org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter">
        <property name="authenticationManager" ref="authenticationManager" />
    </bean>
    
    <!-- Oauth handler Access Denied Handler -->
    
    <bean id="oauthAccessDeniedHandler" class="c.s.m.security.CustomAccessDeniedHandler" />
        <!-- class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" /> -->
    
    <!-- Server resource -->
    
    <sec:http pattern="/api/**" create-session="never"
        entry-point-ref="oauthAuthenticationEntryPoint" use-expressions="true" >
        <sec:csrf disabled="true" />
        <sec:anonymous enabled="false" />
        <sec:intercept-url pattern="/api/**" access="hasRole('ROLE_ADMIN')" />
        <sec:custom-filter ref="resourceServerFilter"
            before="PRE_AUTH_FILTER" />
        <sec:access-denied-handler ref="oauthAccessDeniedHandler" />
    </sec:http>
    
    <!-- Entry point resource -->
    
    <bean id="oauthAuthenticationEntryPoint" class ="c.s.m.security.CustomAuthenticationEntryPoint" />          
    
    <oauth:resource-server id="resourceServerFilter" resource-id="springsec" token-services-ref="tokenServices" />
    
    <bean id="tokenServices"
        class="org.springframework.security.oauth2.provider.token.DefaultTokenServices" >
        <property name="tokenStore" ref="tokenStore" />
        <property name="supportRefreshToken" value="true" />
        <property name="accessTokenValiditySeconds" value="300000" />
        <property name="clientDetailsService" ref="clientDetails" />
    </bean>    
    <bean id="tokenStore"  class="org.springframework.security.oauth2.provider.token.store.JdbcTokenStore">
        <constructor-arg ref="dataSource" />
    </bean>
    <oauth:authorization-server client-details-service-ref="clientDetails" token-services-ref="tokenServices">
        <oauth:authorization-code />
        <oauth:implicit />
        <oauth:refresh-token />
        <oauth:client-credentials />
        <oauth:password authentication-manager-ref="userAuthenticationManager" />
    </oauth:authorization-server>
    
    <sec:authentication-manager id="userAuthenticationManager">
        <sec:authentication-provider ref="customUserDetailsService" />
    </sec:authentication-manager>
    

1 个答案:

答案 0 :(得分:0)

在请求标头中发送Accept: application/json将解决问题。