我想爲我的Spring 3.1和RESTEasy項目實現OAuth 2.0。該項目是基於JSON的REST服務。我使用Spring Security 3.1和spring-security-oauth2版本1.0.0.RC2(它應該是最新的)。到目前爲止,我有彈簧安全設置與默認設置。我還爲OAuth 2.0配置了非常基本的(默認)配置。oauth2提供者端點的處理程序錯誤沒有適配器
我以前使用過REST服務,它工作的很完美。 Spring的安全性似乎也很好。如果我打開指向我的REST服務的鏈接,我將被重定向到登錄頁面。登錄後,我可以進行REST調用,以獲得預期的結果。
當我打開網址,過度緊張或localhost:8080/tools-service/oauth/token
localhost:8080/tools-service/oauth/error
,測試OAuth的,當我訪問/oauth/token
我得到一個錯誤500 以下錯誤是表演。 /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(the Spring OAuth 2.0 sample application)相同,則會收到XML消息(用於/ oauth2 /令牌)和錯誤頁面(用於/ oauth2 /錯誤),正如預期的那樣。
任何幫助或提示將不勝感激。
與安全相關的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>
我的應用程序上下文加載我創建了以下安全-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;
}
}
我很高興有其他人回答他們自己的問題是這樣的。這是一個很好的例子,不管你的問題多麼模糊,總有至少一個其他用戶遇到同樣的事情。如果我可以給你買一瓶啤酒,但至少有一個贊同:-) – Joe
Vertongen,我有同樣的問題,所有相關的谷歌結果已被閱讀,但只有你解決了我的問題,從我的代碼中丟失。感謝您回答您自己的問題並幫助我! –
szpetip
歡迎您。我很高興,這一次仍然有用。 – Vertongen