使用Spring Security保护入口点后面的微服务

时间:2015-05-11 05:23:24

标签: spring spring-security

任何人都知道保护入口点背后的微服务架构的简单方法是什么?

案例是,我们需要一个采用TCP套接字连接的服务器。已经实现了对此应用程序上的用户进行身份验证的实现,它基本上将Spring Security与UserDetailsS​​ervice一起使用,并为套接字连接分配特定的TCP连接。

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

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

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

1 个答案:

答案 0 :(得分:0)

这取决于身份验证过程。如果您已使用支持Single Sign On的身份验证(例如CAS 2),则可以使用CAS的代理功能在Microsoft服务上添加Spring Security。

如果您的前端应用程序隐藏了微服务,即如果没有用户可以直接联系它们,您只需在前端和微服务之间传递请求中的用户ID即可。由于微服务只能从受信任的应用程序中获取,因此您可以直接使用用户ID。

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

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

无论如何,您可以为微服务部分使用无状态安全性,因为前端将始终发送用户ID。根据{{​​3}},它就像向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)
        ...
    }
    ...
}