我的代码中很少有Spring REST API是用基本TLS保护的。但是,我正在尝试使用 OAuth2.0 Spring安全性保护我的 API(我之前没有这样做过)。我无法选择使用Facebook或Google OAuth API进行身份验证/授权部分,因此我创建了自己的API,它将作为REST API所在的应用程序的一部分托管。我按照此处的示例将以下配置设置作为 OAuth 的一部分......
https://techannotation.wordpress.com/2014/04/29/5-minutes-with-spring-oauth-2-0/ http://www.beingjavaguys.com/2014/10/spring-security-oauth2-integration.html
<http pattern="/oauth/token" create-session="stateless"
authentication-manager-ref="authenticationManager"
xmlns="http://www.springframework.org/schema/security">
<intercept-url pattern="/oauth/token" method="GET" access="IS_AUTHENTICATED_FULLY" />
<anonymous enabled="false" />
<http-basic entry-point-ref="clientAuthenticationEntryPoint" />
<custom-filter ref="clientCredentialsTokenEndpointFilter"
after="BASIC_AUTH_FILTER" />
<access-denied-handler ref="oauthAccessDeniedHandler" />
</http>
<http pattern="/generatePDF" create-session="never"
entry-point-ref="oauthAuthenticationEntryPoint"
access-decision-manager-ref="accessDecisionManager" use-expressions="true"
xmlns="http://www.springframework.org/schema/security">
<anonymous enabled="false" />
<intercept-url pattern="/generatePDF" method="POST" access="IS_AUTHENTICATED_FULLY" />
<custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
<access-denied-handler ref="oauthAccessDeniedHandler" />
</http>
<bean id="oauthAuthenticationEntryPoint"
class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
</bean>
<bean id="clientAuthenticationEntryPoint"
class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
<property name="realmName" value="security/client" />
<property name="typeName" value="Basic" />
</bean>
<bean id="oauthAccessDeniedHandler"
class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" />
<bean id="clientCredentialsTokenEndpointFilter"
class="org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter">
<property name="authenticationManager" ref="authenticationManager" />
</bean>
<bean id="accessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased"
xmlns="http://www.springframework.org/schema/beans">
<constructor-arg>
<list>
<bean class="org.springframework.security.oauth2.provider.vote.ScopeVoter" />
<bean class="org.springframework.security.access.vote.AuthenticatedVoter" />
<bean class="org.springframework.security.web.access.expression.WebExpressionVoter" />
</list>
</constructor-arg>
</bean>
<authentication-manager alias="authenticationManager"
xmlns="http://www.springframework.org/schema/security">
<authentication-provider>
<user-service id="userDetailsService">
<user name="hcacl" password="pdf4hcacl" authorities="ROLE_CLIENT" />
</user-service>
</authentication-provider>
</authentication-manager>
<bean id="tokenStore"
class="org.springframework.security.oauth2.provider.token.store.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="clientDetails" />
</bean>
<bean id="userApprovalHandler"
class="org.springframework.security.oauth2.provider.approval.DefaultUserApprovalHandler">
</bean>
<oauth:authorization-server
client-details-service-ref="clientDetails" token-services-ref="tokenServices"
user-approval-handler-ref="userApprovalHandler">
<oauth:authorization-code />
<oauth:implicit />
<oauth:refresh-token />
<oauth:client-credentials />
<oauth:password authentication-manager-ref="clientAuthenticationManager"/>
</oauth:authorization-server>
<oauth:resource-server id="resourceServerFilter"
resource-id="test" token-services-ref="tokenServices" />
<oauth:client-details-service id="clientDetails">
<!-- Add for each client -->
<oauth:client client-id="hcacl"
authorized-grant-types="password,authorization_code,refresh_token,implicit,,client_credentials"
secret="1234567890" authorities="ROLE_CLIENT" scope="read,write,trust" />
</oauth:client-details-service>
<oauth:expression-handler id="oauthExpressionHandler" />
<oauth:web-expression-handler id="oauthWebExpressionHandler" />
然而,当我试图通过设置Oauth参数从soapUI测试受保护的资源时,我总是遇到如下的身份验证错误。。。
[2/26/16 9:37:11:472 EST] 000000b4 webapp E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[documentService]: org.springframework.security.authentication.InsufficientAuthenticationException: User must be authenticated with Spring Security before authorization can be completed.
at org.springframework.security.oauth2.provider.endpoint.AuthorizationEndpoint.authorize(AuthorizationEndpoint.java:138)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
at java.lang.reflect.Method.invoke(Method.java:613)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
在这一点上,我对我需要在哪里进行修复感到困惑。是soapUI中的某种设置,还是代码中OAuth设置的调整?
非常感谢任何解决此问题的指示!
毕竟,我发现我的配置是正确的并且可以工作,但是我不知道如何从soapUI测试我的API。soapUI有一个在资源上使用OAuth认证的选项,但是我不能正确地设置它。相反,我在我的soapUI项目中创建了另一个/oauth/token资源,并取回了令牌。
我的Spring Rest控制器有问题。我试图发布(PUT)数据从我的客户端(angularJS)到我的服务器(Spring),但每次我试图发送的东西我得到一个错误。 有了Maven,我在SpringAPI中添加了和。我还使用自动将Jackson消息转换器添加到Spring。在我的Spring控制器中,我使用访问Spring的REST方法。 我的REST API控制器: 我尝试过不同类型的消费:
需要对Oauth2客户端的集成测试的帮助。 设置: 具有受保护UI和API的客户端 完成所有密码验证并检索访问令牌的身份验证服务器 集成测试: 放心用于终点测试 在实现Oauth2之前,测试工作良好 Ole测试示例: 问题: 如何使此测试再次工作? 应如何更改res-assured设置以支持OAuth2? 是否需要模拟身份验证服务器,或者是否可以注入/mock安全上下文?
我正在使用一个Spring Boot+Spring Security OAuth2应用程序,我相信它的灵感来自Dave Syer的示例。应用程序被配置为OAuth2授权服务器,具有使用资源所有者密码凭据流的单个公共客户端。成功的令牌被配置为JWT。 公共Angular客户机向/oauth/token发送一个POST请求,该请求带有包含客户机id和秘密的基本身份验证头(这是让客户机进行身份验证的最简
与Oauth2和spring Security集成测试有问题...在将Oauth2配置添加到代码库之前,集成测试工作正常 设置: 具有受保护数据的客户端服务器还包含权限列表,使用Spring Security和OAuth2 提供访问令牌和执行身份验证的身份验证服务器 工作流: null Oauth2配置: 自定义安全逻辑: 还有一个:
无论我使用什么技术,任何通用的解决方案都将有所帮助。谢谢
我使用spring Boot、spring Oauth2构建SSO服务器。当在独立模式下,令牌存储在内存中,它运行良好。但现在,我想在多个服务器上运行SSO服务器。我用JDBC更改了存储策略,然后在端口9999和9998上运行两个实例。我不知道如何配置application.yml文件的客户端和资源服务器。我在客户端服务器上尝试了以下配置: