使用 Spring 安全性保护入口点后面的微服务

Securing microservices behind a entrypoint with Spring Security

有人知道保护入口点后面的微服务架构的简单方法是什么吗?

情况是,我们需要一个接受 TCP 套接字连接的服务器。在此应用程序上验证用户的实现已经实现,它基本上使用 Spring Security with UserDetailsS​​ervice 并使用特定的 TCP 连接分配套接字连接。

但现在我们正在考虑采用更多的微服务架构,但我们在寻找将用户传播到不同服务的好方法时遇到了问题。

例如: 用户连接到 TCP 套接字服务器,进行身份验证。 用户通过套接字发送请求,服务器将调用传播到另一个支持服务(例如 Spring Data REST 存储库),但客户端进行的调用(例如对一组数据的更改请求)需要特定的用户角色。这个角色怎么查?

基本上,TCP 服务器代表用户发出服务请求。

这取决于身份验证程序。如果您已经使用支持单点登录的身份验证(例如 CAS 2),则可以使用 CAS 的代理功能在您的微服务上添加 Spring 安全性。

如果你的微服务隐藏在你的前端应用程序后面,即没有用户可以直接联系到它们,你可以简单地在前端和微服务之间的请求中传递用户id。由于微服务只能从受信任的应用程序中命中,所以可以直接使用用户id。

如果您想在微服务中使用高级 spring- 安全功能(@PreAuthorize@PostFilter、...),您可以使用自定义 PreAuthenticatedAuthenticationFilter 在微服务的 spring 安全配置中,无论身份验证过程是什么。该过滤器将简单地使用请求中传递的用户 ID 来设置用户身份验证令牌。

所有这些解决方案都不允许在前端应用程序中缓存密码,这总是可能的(在会话属性中),但看起来是一种糟糕的安全做法。

无论如何,您可以为微服务部分使用无状态安全性,因为前端总是会发送一个用户 ID。根据Spring Security Reference Manual,在http config中添加一个属性很简单:< http create-session=stateless>(这个参数从3.0版本开始存在)

如果您使用 java 配置,您可以从 WebSecurityConfigurerAdapter 执行相同的操作:

class SecurityConf extends WebSecurityConfigurerAdapter {
    ...
    @Override
    protected void  configure(HttpSecurity http) {
        http.sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        ...
    }
    ...
}