使用 Spring 安全性保护入口点后面的微服务
Securing microservices behind a entrypoint with Spring Security
有人知道保护入口点后面的微服务架构的简单方法是什么吗?
情况是,我们需要一个接受 TCP 套接字连接的服务器。在此应用程序上验证用户的实现已经实现,它基本上使用 Spring Security with UserDetailsService 并使用特定的 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)
...
}
...
}
有人知道保护入口点后面的微服务架构的简单方法是什么吗?
情况是,我们需要一个接受 TCP 套接字连接的服务器。在此应用程序上验证用户的实现已经实现,它基本上使用 Spring Security with UserDetailsService 并使用特定的 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)
...
}
...
}