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;
}
}