我们在内部使用Akka提供小型服务,以非阻塞方式并发运行操作。 Akka对我们很有价值,但是现在我需要为一些演员添加授权(对特定对象的搜索和访问限制进行过滤)。在将大部分工作转移到Akka系统管理的演员之前,我们使用Spring Boot和Spring Security处理Web容器上的身份验证和授权。天真,我以为我可以用
String userId = SecurityContextHolder.getContext()。getAuthentication()。getName();
在演员中,但当然失败是因为我们在Akka控制的线程上。默认情况下,我无法控制我的Akka系统的线程,因此没有可用的线程本地安全上下文。
我看到两个选项:
On 1:我可以使用消息传递用户ID,以使其可供相应的actor使用。但是,当经过身份验证的用户标识成为消息的一部分时,如何保护我的演员不会收到包含任何类型用户标识的消息?这是不好的做法还是Akka系统可以防止这种滥用?我是否需要激活Akka系统的进一步安全性?
On 2:我可以在创建Akka系统时传递自己的ExecutionContext。这允许我将Spring的DelegatingSecurityContextExecutorService实例传递给它,希望线程本地SecurityContext正在顺序传递。有人成功地做到了吗?我想到的一个问题是:当演员实际在远程机器上运行时会发生什么?那里的线程肯定没有SecurityContext。
那你对此有何看法?你还有其他选择吗?非常感谢提前!