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

Spring-如何在没有用户的情况下通过Faign调用安全服务

牛华皓
2023-03-14

我有一个Spring云网关和许多或多或少相互依赖的服务。Angular客户端通过网关与服务进行通信。网关和服务(资源服务器)由OAuth2保护,令牌由外部身份验证服务器提供。在我们使用的服务之间拨打电话。我们使用RequestInterceptor for Faign在服务之间转发用户令牌。但是:有些服务在调用endpoint时使用AMQP创建事件。在再次监听事件的服务中,调用了其他服务。由于传入消息没有附加安全上下文,因此这些调用会在401错误上运行。

有没有任何方法可以将安全上下文附加到AMQP消息,或者让Faign通过client_credentials-grant获得令牌?

  • Spring版:2.3.5

共有1个答案

高山
2023-03-14

正如在许多其他来源中所述,OAuth2FignRequestInterceptor是该问题的可能解决方案。我害怕使用它,因为它被标记为已弃用。我刚刚看到评论说“将在下一个主要版本中转移到Spring Cloud Openfeign”。

由于这意味着我们的依赖关系发生了变化,因此使用以下解决方案应该没有问题:

@Configuration
public class FeignConfig {

    private ClientCredentialsResourceDetails clientCredentialsResource() {
        ClientCredentialsResourceDetails resource = new ClientCredentialsResourceDetails();

        resource.setAccessTokenUri(<TOKEN_ENDPOINT>);
        resource.setClientId(<CLIENT_ID>);
        resource.setClientSecret(<SECRET>);
        resource.setGrantType("client_credentials");
        resource.setAuthenticationScheme(AuthenticationScheme.header);

        return resource;
    }

    @Bean
    public RequestInterceptor oauth2FeignRequestInterceptor() {
        return new OAuth2FeignRequestInterceptor(new DefaultOAuth2ClientContext(), clientCredentialsResource());
    }
}

使用Spring Security 5和OAuth2依赖项,如果您只是在您的WebSecurity-配置中使用http.oauth2ResourceServer(). jwt()链,则不需要其他注释,正如我从这篇很棒的文章中学到的:https://blog.jdriven.com/2019/11/spring-cloud-gateway-with-openid-connect-and-token-relay/

 类似资料:
  • 我想在我的spring web应用程序中添加几个过滤器,但至少现在不会有任何关于安全性的内容。所以。没有spring-security我所能做的就是在web.xml中定义多个过滤器(定义过滤器的旧方法)。要能够使用spring过滤器链,我需要为我的项目添加spring-security作为依赖项,这似乎很奇怪。也许我做错了什么,而且确实有过滤器链可以在没有spring-security依赖的情况下

  • 是否有一种方法可以调用支持Eureka的服务,而无需调用消费者向Eureka注册?或者换句话说,没有@EnableEurekClient注释?或者换言之,是否有一种方法可以从非Spring Java应用程序中使用带状负载平衡器调用支持Eureka的服务? 我无法从文档中得到它。有这样的例子吗?

  • 问题内容: 我正试图从这样打电话: 该代码可以正常编译,但是会失败。我不知道为什么我无法得到。有人可以帮我吗? 问题答案: 是输入输出参数。进行呼叫时,必须将其设置为缓冲区()的大小。它的类型也是,所以在Go中使用。Windows 类型是指向的指针(具有)。参见来源。 还返回3个值: 存储返回并打印。完成此操作后,您会更早发现错误: 印刷品: 这意味着更多的数据比什么适合入缓冲区您传递可用- 或者

  • 问题内容: 我在整个应用程序中都使用spring 。现在,我也想为一个没有的创建一个。那有可能吗? 问题答案: JPA要求每个实体都有一个ID。因此,不可以,没有ID的实体是不允许的。 每个JPA实体都必须有一个主键。 从JPA规范 您可能想从这里阅读更多有关JPA如何处理数据库端没有ID的情况的信息(请参阅“无主键”)。

  • 问题内容: 我正在尝试设置spring xml配置,而不必创建进一步的。但是,即使我将数据库属性包括在 spring.xml: 我在这里想念什么? 问题答案: 在entityManagerFactory bean定义中指定“ packagesToScan”和“ persistenceUnitName”属性。 请注意,这适用于Spring版本> 3.1

  • 我想在没有用户角色的情况下实现Spring Security。我尝试了这个: 我想配置Spring Security以将数据库用于Rest api请求。我尝试了这个: 服务: 服务实现 实施: 我有两个问题: > 如何将Spring Security与用户角色一起使用? 如何使用用户名和密码验证请求。我看到,只能接受用户名。是否有其他方法来实现代码?