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

如何使用spring security 5在Spring Boot应用程序(不是web应用程序)中获得oauth2访问令牌

楚俊杰
2023-03-14

我需要在Spring Boot应用程序的服务层中获得访问令牌(grant_type=client_credentials),以便与其他微服务对话(服务到服务的交互)。这一层没有spring http会话或auth,我只有client_id、client_secret和令牌URL。这些属性在Application.properties中设置为:

spring.security.oauth2.client.registration.auth1.client-id=***
spring.security.oauth2.client.registration.auth1.client-secret=***
spring.security.oauth2.client.registration.auth1.authorization-grant-type=client_credentials
spring.security.oauth2.client.provider.auth1.tokenUri=***

这在Spring Security OAuth中似乎很简单,但在Spring Security中却无法实现。参考了spring Security5的文档,但一切似乎都在web界面的上下文中。我知道我可以通过http调用来获取带有我所拥有的信息的令牌,但我想利用这个框架...

场景:让我们调用这个spring boot应用程序服务A。还有其他服务可以调用A来处理http上的更新,或者发送关于A监听的主题的kafka消息。当A处理更新/消息时,它需要向服务B发送一些数据,服务B需要Authz的访问令牌。这就是我需要访问令牌的地方。因此,这种交互本质上是服务-服务的,而不是特定于用户的。

共有1个答案

房新翰
2023-03-14

如果不在web界面的上下文中,您将希望查看服务层。

从Spring Security的Javadocs forAuthorizedClientServiceOAuth2AuthorizedClientManager:

{@Link OAuth2AuthorizedClientManager}的实现,它能够在{@code HttpServletRequest}上下文之外操作,例如在调度/后台线程和/或服务层中。

    @Bean
    OAuth2AuthorizedClientManager authorizedClientManager
            (ClientRegistrationRepository clients) {
        OAuth2AuthorizedClientService service = 
                new InMemoryOAuth2AuthorizedClientService(clients);
        AuthorizedClientServiceOAuth2AuthorizedClientManager manager =
                new AuthorizedClientServiceOAuth2AuthorizedClientManager(clients, service);
        OAuth2AuthorizedClientProvider authorizedClientProvider =
                OAuth2AuthorizedClientProviderBuilder.builder()
                        .clientCredentials()
                        .build();
        manager.setAuthorizedClientProvider(authorizedClientProvider);
        return manager;
    }

>

  • 第一个是OAuth2AuthorizedClientService,如果您希望在数据库中存储令牌,它非常方便--在Spring Security 5.2中,唯一的实现是内存中的实现;但是,似乎5.3将附带一个JDBC实现。

    第二个是OAuth2AuthorizedClientProvider,它实际上执行令牌请求,就像您要创建的客户端凭据一样。

    创建此管理器后,您可以将其连接到web客户端:

        @Bean
        WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager) {
            ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2 =
                    new ServletOAuth2AuthorizedClientExchangeFilterFunction
                            (authorizedClientManager);
            oauth2.setDefaultClientRegistrationId("auth1");
            return WebClient.builder()
                    .apply(oauth2.oauth2Configuration())
                    .build();
        }
    

  •  类似资料:
    • 我有Kafka Streams java应用程序启动并运行。我试图使用KSQL创建简单的查询,并使用Kafka流来实现复杂的解决方案。我希望将KSQL和Kafka流作为Java应用程序运行。 我打算通过https://github.com/confluentinc/ksql/blob/master/ksqldb-examples/src/main/java/io/confluent/ksql/em

    • 要获取请求URL,可以在堆栈溢出中找到以下方法。 第一种方法: 第二种方法: 第三种方法: 我不知道在spring boot应用程序中使用哪一个来获取请求URL。 如果我使用第三种方法,那么我是否需要在配置类中创建RequestContextListener的bean,如下所示?

    • 我目前正在与访问令牌的生存期作斗争。我有dotnet核心Web应用程序和dotnet核心Web API。 web应用程序受OpenIDConnect授权的保护。一旦您尝试连接到web应用程序,您将被重定向到Microsoft登录表单,成功登录后,访问令牌将被提供并与刷新令牌一起存储到cookie中。 因此,访问令牌在授权头中传递给我的WebAPI请求。当access_token生存期到期时,我的W

    • 我试图在SpringMVC中运行SpringBoot应用程序,在SpringMVCPOM中添加SpringBoot应用程序依赖项,并扫描SpringBoot包,但我面临以下问题

    • 我已经为Postgresql启用了复制,并且正在使用PGPool进行负载平衡。 我在使用HikariCP甚至Apache DBCP连接到Postgres时遇到了问题。 在SpringBoot应用程序中有没有使用PGPool的方法? 请查找堆栈跟踪: 2018-08-10 10:20:19.124信息37879----[main]com.zaxxer.hikari.hikaridatasource:

    • 我有一个CodeIgniter 2.1内部网络应用程序,它使用一个简单的共享密码(没有用户名)进行身份验证。现在是时候把它拿出来,理想地在我们公司的谷歌应用程序帐户中使用单点登录来验证特定的内部用户,并且在未来允许外部用户使用他们的谷歌/推特/脸书帐户进行验证。 所以问题是,我应该从哪里开始实现我在上面寻找的目标? 谷歌应用程序的谷歌SAML SSO 我认为我仍然需要维护一个user_ids和电子