如何将用户角色从授权服务器复制到下游微服务?

时间:2017-06-20 11:24:10

标签: security spring-security jwt microservices spring-cloud

我需要实现一个应用程序,我将使用生成JWT令牌的Authorization Server。这些令牌将包括授予用户的角色,然后授权用户访问不同的资源。还将有一个网关,可以添加此安全性。

我的问题是关于用户角色和内部微服务之间的安全性。

创建用户时,应该授予他一组角色,以后可能会授予他不同的角色,或者稍后可能会添加新角色。所有这些信息都应存储在授权服务器中。但是这些信息如何复制到其他微服务?如果我使用像Spring Security这样的框架来保护我的端点,在那里我添加了不同URL所需的角色,我是否需要将用户角色硬编码到下游微服务中的安全配置中,或者是否有其他方法可以从授权服务器?

该体系结构将在公共网络中使用API​​网关,然后与内部网络中的服务发现进行通信,以查找不同的微服务。这些也通过服务发现找到了彼此。我用Zuul进行路由。在这种情况下,我是否还需要保护内部网络中的通信?我知道要使用Spring Security进行授权,我需要传递JWT令牌以获取用户角色。但是否则有必要呢?是否足以使用HTTPS从客户端到网关和私有网络中的不安全HTTP?

1 个答案:

答案 0 :(得分:1)

这里有很多选择。

其中之一是您可以将spring-security-oauth2与弹簧安全性结合使用。在此设置中,您将区分两种应用程序:

  • 授权服务(AS) - 此服务发布并验证访问令牌以验证客户端(例如使用密码授予或授权代码);
  • 资源服务(RS) - 例如,它为资源上的CRUD操作公开REST API。端点受到保护。 RS与AS通信以授予访问权限;

在资源服务器中,您将像在通常的独立应用程序中一样使用和配置Spring Security。下面是一个非常简单的例子。

以下是具有受保护端点的REST控制器中的代码:

@PreAuthorize("hasRole('READ_BOOK')")
@GetMapping(value = "/books/{id}")
public ResponseEntity<Book> getBook(@PathVariable("id") String id) {
    ...
    //retrieves book details if you have role READ_BOOK
}

@PreAuthorize("hasRole('WRITE_BOOK')")
@PostMapping(value = "/books")
public Book createBook(@RequestParam("title") String title) {
    ...
    //creates a book if you have role WRITE_BOOK
}

安全配置看起来就像编写单片应用程序一样,但以下情况除外:

  • 您将在配置中添加@EnableResourceServer注释;
  • 您将配置RemoteTokenServices的实例 - 此服务的任务是验证针对授权服务器提供的令牌并获取用户角色;

AS将根据某些OAuth2工作流发出访问令牌。客户端将使用这些令牌来访问受保护的端点。

我已经制作了一个小型PoC(概念验证)设置,其中我创建了两个简单的应用程序,显示整个过程中的内容。请找到here并随时提交问题,提案和PR。完整的源代码包含更多解释。

请注意,在某些情况下,此设置可能会导致过多的服务间通信。我看到了一个更复杂的设置,其中API网关充当资源服务器,如果用户有足够的凭据,它会使用必要的详细信息丰富请求,并将请求传递给基本信任网关的下游服务。