当前位置: 首页 > 知识库问答 >
问题:

OAuth2 与 Spring REST API 的集成

尹弘壮
2023-03-14

我的代码中很少有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设置的调整?

非常感谢任何解决此问题的指示!

共有1个答案

龚星洲
2023-03-14

毕竟,我发现我的配置是正确的并且可以工作,但是我不知道如何从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文件的客户端和资源服务器。我在客户端服务器上尝试了以下配置: