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

Oauth 2:Spring Boot-保护微服务的单独资源服务器

邹缪文
2023-03-14

对于我最近的项目,我使用springboot创建了一个单独的资源服务器。资源服务器的配置方式是,它将检查对API的2脚和3脚访问,并验证JWT令牌。资源服务器是一个在其容器中运行的独立的Spring Bootjar
我们使用Spring Boot创建了几个微服务,这些微服务是可执行的jar,在它们的容器中独立部署和运行。资源服务器将保护这些微服务中暴露的endpoint。为此,我在资源服务器中创建了一个RestController,其中暴露了endpoint,当请求进入时,它将调用微服务endpoint。例如
微服务。java-在端口8080上运行

@RequestMapping("/getUser")
public String getUserName(){
   return "xyz";
}

资源服务器-在端口8090上运行
ResourceServerController.java

@RequestMapping("/userInfo")
public String getUserName(){
 // calling above microservice using rest template
}

一个微服务中可能有多个endpoint,因为我们必须保护它们,所以在资源服务器的其余控制器中代理每个endpoint对吗?我不确定这是不是一种正确的方法。我们想到的另一种方法是创建一个jar资源服务器,并作为每个微服务的依赖项进行部署。这样,我们不需要在资源服务器的Rest Controller中代理endpoint
只是想知道使用单独的资源服务器保护微服务的最佳方法。

共有2个答案

卢阳成
2023-03-14

JWT是自包含的令牌,可以存储REST服务用户的访问范围。JWT由授权服务器发布。在资源服务器中,您应该验证REST服务用户的每个请求。如果资源服务器在spring boot上运行,则可以使用以下注释:

@PreAuthorize(“hasRole('ROLE_VIEW')”)

至于你的服务相互调用的部分,没有必要使用JWT,因为没有涉及REST服务用户。微服务可以通过简单的BasicAuth,CORS进行保护,或者将它们定位在一个网络中,而无需从外部网络访问

柯伟志
2023-03-14

不建议使用共享库选项。微服务的巨大好处是独立性,如果你这样做,那将是折腾的。

一个更好的选择是看看是否可以基于范围提供对API的访问。这样,当您的授权服务器发布JWT令牌时,它会为用户发送所有适用的范围。

然后,在您的资源服务器中,您可以使用Spring Boot中的以下注释启用对微服务的访问

   @PreAuthorize("#oauth2.hasScope('read')")

另一种方法是,您可以使用角色创建角色和预授权。

如果上述选项不起作用,则您当前遵循的基于代理服务的方法非常好。您应该考虑的唯一方面是查看JWT令牌验证是否可以移动到相应的微服务,以便保护您的所有服务。

同样,当你实现微服务时,代码复制是非常好的,如果这是你主要关心的,不要犹豫在每个服务中添加相同的逻辑。对于微服务,复制比错误的抽象要好

 类似资料:
  • 我有两个微服务,它们应该相互通信。我的例子是:微服务A向微服务B发出请求。用户不应该有访问权限,只能访问其他微服务。我想,那个解决方案可能是“Http基本身份验证”,所以microservice A还应该向microservice B发送用户名和密码。这很好,但microservice A应该如何找到用户名和密码呢?我正在使用Eureka作为发现服务,但在这种情况下,我没有找到任何可以帮助我的。我

  • 我需要了解在我的项目范围内使用autheorizaion服务器的便利性。 我们正在实现我们的服务并将其部署到客户环境中。 客户基础结构已经提供了一种身份验证机制,以便对用户进行身份验证。 此机制拦截所有通信并将用户重定向到“登录”表单。 之后,用户被重定向到我们的服务,我们必须处理和消化它,并使用JWT令牌进行响应。 这是我感到迷茫的地方: 我在想: 使用Spring oauth2 向授权服务器请

  • 问题内容: 我们已经设置了OAuth2授权服务器,因此我需要创建一个相应的资源服务器(单独的服务器)。我们计划使用Spring Security OAuth2项目。他们关于设置资源服务器的文档: https://github.com/spring-projects/spring-security- oauth/wiki/oAuth2#resource-server-configuration 应该

  • 我们已经设置了一个OAuth2授权服务器,所以我需要创建一个相应的资源服务器(单独的服务器)。我们计划使用Spring Security OAuth2项目。他们关于设置资源服务器的文档: https://github.com/spring-projects/spring-security-oauth/wiki/oauth2#资源-服务器-配置 应该指向令牌处理bean。然而,令牌处理似乎是由服务器

  • 试图让UserDetailsService为我设置的oauth2资源服务器工作。我能够成功地对jwt进行身份验证,但是我所做的一切似乎都无法让它调用loadUserByUsername方法。它最初使用的是SAML,并且可以工作,但现在我切换到了Oauth2,我无法让它工作。 我在google上发现,我只需要用@service将类注册为bean,spring就会把它捡起来,但它不起作用。我还尝试通过

  • 我有几个微服务,每个微服务都有用于CRUD操作的RESTendpoint。我必须创建一个工作流,该工作流将从一个带有一些初始输入的微服务开始,但一个微服务的稍后输出可以用作其他微服务的输入。可以对这些REST API进行一些同步和异步调用。 我已经寻找了一些工作流引擎,但我不认为我可以在不编写任何java代码的情况下创建我的工作流。