我需要实现一个应用程序,我将使用生成JWT令牌的Authorization Server。这些令牌将包括授予用户的角色,然后授权用户访问不同的资源。还将有一个网关,可以添加此安全性。
我的问题是关于用户角色和内部微服务之间的安全性。
创建用户时,应该授予他一组角色,以后可能会授予他不同的角色,或者稍后可能会添加新角色。所有这些信息都应存储在授权服务器中。但是这些信息如何复制到其他微服务?如果我使用像Spring Security这样的框架来保护我的端点,在那里我添加了不同URL所需的角色,我是否需要将用户角色硬编码到下游微服务中的安全配置中,或者是否有其他方法可以从授权服务器?
该体系结构将在公共网络中使用API网关,然后与内部网络中的服务发现进行通信,以查找不同的微服务。这些也通过服务发现找到了彼此。我用Zuul进行路由。在这种情况下,我是否还需要保护内部网络中的通信?我知道要使用Spring Security进行授权,我需要传递JWT令牌以获取用户角色。但是否则有必要呢?是否足以使用HTTPS从客户端到网关和私有网络中的不安全HTTP?
答案 0 :(得分:1)
这里有很多选择。
其中之一是您可以将spring-security-oauth2
与弹簧安全性结合使用。在此设置中,您将区分两种应用程序:
在资源服务器中,您将像在通常的独立应用程序中一样使用和配置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网关充当资源服务器,如果用户有足够的凭据,它会使用必要的详细信息丰富请求,并将请求传递给基本信任网关的下游服务。