5

Spring 3.1 およびRESTEasyプロジェクトに OAuth 2.0 を実装したいと考えています。プロジェクトは JSON ベースの REST サービスです。私は Spring Security 3.1 と spring-security-oauth2 バージョン 1.0.0.RC2 (最新のはずです) を使用しています。これまでのところ、デフォルト設定で春のセキュリティをセットアップしています。また、OAuth 2.0 の非常に基本的な (既定の) 構成もあります。

以前は REST サービスを使用していましたが、完璧に機能します。Spring セキュリティも問題なく機能しているようです。REST サービスへのリンクを開くと、ログイン ページにリダイレクトされます。ログイン後、REST 呼び出しを行うことができ、期待どおりの結果が得られます。

OAuth をテストするためにhet urlslocalhost:8080/tools-service/oauth/tokenまたはを開くlocalhost:8080/tools-service/oauth/errorと、エラー 500 が表示されます。 にアクセスすると、次のエラーが表示されます/oauth/token。のエラー/oauth/errorは似ています。

HTTP Status 500 - No adapter for handler [public org.springframework.http.ResponseEntity org.springframework.security.oauth2.provider.endpoint.TokenEndpoint.getAccessToken(java.security.Principal,java.lang.String,java.util.Map)]: Does your handler implement a supported interface like Controller?

私が正しければ、これはTokenEndpoint.getAccessToken関数にエラーがあることを意味しますか? そのクラスはSpringフレームワークの一部であるため(コードを調べたところ、問題ないようです)、問題が実際にそれらのクラスに関連しているとは思いません。それは私を無知のままにします。

これがなぜ起こるのか、どうすればこれを解決できるのかを知りたいと思います。私はおそらく、ブラウザでこれらの URL にアクセスすることを許可されていないという事実を考慮しました。ただし、Sparklr2 ( Spring OAuth 2.0 サンプル アプリケーション) で同じことを試すと、期待どおりの XML メッセージ (/oauth2/token の場合) とエラー ページ (/oauth2/error の場合) が表示されます。

どんな助けやヒントも大歓迎です。


web.xml からのセキュリティ関連のスニペット:

<filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

私のアプリケーション コンテキストは、私が作成した次の security-config.xml ファイルを読み込みます。

<?xml version="1.0" encoding="UTF-8"?>

<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:sec="http://www.springframework.org/schema/security"
    xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                        http://www.springframework.org/schema/security
                        http://www.springframework.org/schema/security/spring-security-3.1.xsd
                        http://www.springframework.org/schema/security/oauth2
                        http://www.springframework.org/schema/security/spring-security-oauth2.xsd">

    <sec:http auto-config="true">
        <sec:intercept-url pattern="/**" access="ROLE_USER" />
    </sec:http>

    <sec:authentication-manager>
        <sec:authentication-provider>
            <sec:user-service>
                <sec:user name="user1" password="test123" authorities="ROLE_USER" />
                <sec:user name="user2" password="hello123" authorities="ROLE_USER" />
            </sec:user-service>
        </sec:authentication-provider>
    </sec:authentication-manager>

    <sec:global-method-security pre-post-annotations="enabled" proxy-target-class="true">
        <sec:expression-handler ref="oauthExpressionHandler" />
    </sec:global-method-security>


    <bean id="clientDetailsService" class="be.collectortools.rest.service.security.CollectorDetailsServiceImpl" />

    <bean id="tokenStore" class="org.springframework.security.oauth2.provider.token.InMemoryTokenStore" />

    <bean id="tokenServices" class="org.springframework.security.oauth2.provider.token.DefaultTokenServices">
        <property name="tokenStore" ref="tokenStore" />
        <property name="supportRefreshToken" value="true" />
        <property name="clientDetailsService" ref="clientDetailsService"/>
    </bean>

    <oauth:authorization-server
            client-details-service-ref="clientDetailsService"
            token-services-ref="tokenServices">
        <oauth:authorization-code />
        <oauth:implicit />
        <oauth:refresh-token />
        <oauth:client-credentials />
        <oauth:password />
    </oauth:authorization-server>

    <oauth:expression-handler id="oauthExpressionHandler" />

</beans>

CollectorClientDetails の実装は単なるダミー コードです。

@Service
public class CollectorDetailsServiceImpl implements ClientDetailsService {

    @Resource
    private CollectorClientDetailsRepository collectorClientDetailsRepository;

    @Override
    public ClientDetails loadClientByClientId(final String clientId) throws OAuth2Exception {
        CollectorClientDetails dummyClient = new CollectorClientDetails();
        dummyClient.setClientId(clientId);

        return dummyClient;
    }

}
4

1 に答える 1

11

この問題を数日冷ましてから、新しい Google 検索を行いました。これにより、Spring Source フォーラム ( http://forum.springsource.org/showthread.php?130684-OAuth2-No-adapter-for-handler-exception ) にたどり着きました。

ここで、banifou にも同じ問題があることがわかりました。Dave Syer はこの質問に次のように答えました。

<mvc:annnotation-driven/>バニラスパークルからを削除したようです。それをハンドラーアダプターに戻すと、定義されると思います。

Spring セキュリティは、Spring MVC フレームワークに依存してリクエストとレスポンスを処理します。そのため、MVC フレームワークを含めて、Spring セキュリティ OAuth が機能するように適切にセットアップする必要があります。

解決策は、アプリケーション コンテキストに 2 つのタグを追加したことです。

  • <mvc:annotation-driven />

MVC フレームワークで注釈を処理できるようにします。これにより、 @FrameworkEndpoint が適切に機能します。で使用されている後者のものでpublic class TokenEndpoint、エラー 500 が発生しました。

  • <mvc:default-servlet-handler />

このハンドラは、すべてのリクエストをデフォルトのサーブレットに転送します。したがって、他のすべての URL HandlerMappings の順序で最後にすることが重要です。を使うとこうなります<mvc:annotation-driven>。(Spring のドキュメントからの引用。)

詳細については 、注釈駆動型デフォルト サーブレット ハンドラを参照してください。

<?xml version='1.0' encoding='UTF-8'?>

<beans  xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-3.1.xsd
                            http://www.springframework.org/schema/mvc
                            http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">

    <context:component-scan base-package="be.collectortools.rest"/>
    <context:annotation-config/>

    <mvc:annotation-driven />
    <mvc:default-servlet-handler />

    <import resource="classpath:springmvc-resteasy.xml"/>
    <import resource="mongo-config.xml"/>
    <import resource="security-config.xml"/>

</beans>
于 2012-10-07T12:19:02.960 に答える