[英]Spring Security shows default login instead of OAuth2
我正在編寫需要驗證用戶身份的RESTful
Web服務(在Tomcat上運行的Jersey)。 計划是將它們重定向為通過OAuth2
登錄到Google。 一旦他們授予我們查看其電子郵件地址的權限,我們就會知道他們是否是系統中的已知用戶。
我正在使用Spring Security
。 我使用了基本身份驗證(用戶和密碼的硬連接列表)。然后,我在XML配置中添加了OAuth2
元素,但是當我從瀏覽器訪問該服務時,仍然會提示瀏覽器登錄重定向到Google的網站。 控制台沒有記錄任何特定的錯誤。
建議將不勝感激。 這是我的Spring Security配置文件:spring-security.xml(盡管沒有真實客戶端的ID和密碼)。
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.2.xsd
http://www.springframework.org/schema/security/oauth2
http://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd">
<debug/>
<oauth:client id="oauth2ClientFilter" />
<oauth:resource id="googleOauth2Resource" type="authorization_code" client-id="myclientid.apps.googleusercontent.com" client-secret="myclientsecret"
access-token-uri="https://accounts.google.com/o/oauth2/v3/token" user-authorization-uri="https://accounts.google.com/o/oauth2/auth" scope="email" />
<http auto-config='true' xmlns="http://www.springframework.org/schema/security">
<intercept-url pattern="/V1/**" access="ROLE_USER" />
<intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<custom-filter ref="oauth2ClientFilter" after="EXCEPTION_TRANSLATION_FILTER" />
</http>
<oauth:rest-template id="googleOauthRestTemplate" resource="googleOauth2Resource" />
<authentication-manager>
</authentication-manager>
</beans:beans>
這是我的web.xml
文件的膽量。 (與我列出的用戶名和密碼的硬列表相比,這里沒有任何改變。)
<!-- Require HTTPS for everything except /img (favicon) and /css. -->
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOnly</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOrHTTP</web-resource-name>
<url-pattern>*.ico</url-pattern>
<url-pattern>/img/*</url-pattern>
<url-pattern>/css/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- Register resources and providers under com.vogella.jersey.first package. -->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.foobar.dataservices</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/V1/*</url-pattern>
</servlet-mapping>
<resource-ref>
<description>TAE DB Connection Pool</description>
<res-ref-name>jdbc/taeDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/spring-security.xml</param-value>
</context-param>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
對於OAuth2
正常運行的建議,我們將不勝感激。
從spring-security.xml中的http元素中刪除auto-config =“ true”擺脫了錯誤的登錄表單。
這揭示了一個新錯誤:
配置問題:無法建立AuthenticationEntryPoint。 請確保您具有通過名稱空間配置的登錄機制(例如form-login),或使用'entry-point-ref'屬性指定自定義AuthenticationEntryPoint
所以我添加了缺少的entry-point-ref
和access-denied-handler
:
<http xmlns="http://www.springframework.org/schema/security" entry-point-ref="oauthAuthenticationEntryPoint">
<intercept-url pattern="/V1/**" access="IS_AUTHENTICATED_FULLY" />
<intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<custom-filter ref="oauth2ClientFilter" after="EXCEPTION_TRANSLATION_FILTER" />
<access-denied-handler ref="oauthAccessDeniedHandler" />
</http>
<beans:bean id="oauthAuthenticationEntryPoint"
class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
</beans:bean>
<beans:bean id="oauthAccessDeniedHandler"
class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler">
</beans:bean>
現在,該服務將啟動,而不會記錄任何錯誤,並且不會顯示錯誤的登錄表單。
(但是請注意,它拒絕了我所有資源的許可。我認為Spring Security
會代表我的RESTful
服務重定向到Google,但是也許我的網頁需要在調用服務之前獲得授權令牌?我認為這是一個新話題。 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.