2012-08-12 40 views
4

我正在运行Akka 2.0.2微内核,并希望为不受信任的远程参与者实现身份验证方案。如何隐藏Akka远程演员查找?

首先想到的是设置一个认证参与者,该参与者在认证成功时返回对工作参与者的引用。

但是,我应该如何保护工作参与者不被简单直接通过actorFor()远程查找,从而绕过认证呢?

也就是说,我想要阻止远程参与者访问我的微内核参与者系统中的参与者而不进行身份验证。

不给工作男主角actorOf名称()是不够的,因为它会得到一个容易猜测的自动生成的名称。有没有办法禁用演员的远程查找,但仍然能够将他们的ActorRef发布给远程系统?

+0

不是我所知道的。你最好在Akka邮件列表上询问,因为这可能是一个功能请求。 – 2012-08-12 11:33:12

+0

您是否想要防止远程参与者在未经身份验证的情况下访问ActorSystem中的参与者,或者是否想要防止ActorSystem中的参与者无需身份验证就访问远程参与者? – sourcedelica 2012-08-12 12:50:37

+0

我想阻止远程演员访问我的微内核参与者系统中的演员而不进行身份验证。我编辑了试图澄清的问题。 – 2012-08-12 12:54:23

回答

3

我认为你与认证演员走在了正确的轨道上。认证参与者返回ActorRef和令牌。远程参与者必须在消息中将该令牌包含到本地工作者角色中。工作人员在做工作之前会验证令牌。

trait AuthenticatingActor { this => Actor 
    val authenticationService = //... 

    def receive = { 
    case UnauthenticatedRequest(token, msg) => 
     if (authenticationService.validate(token) 
     authenticatedRecieve(msg) 
     else 
     sender ! RequestNotAuthenticated(token, "token invalid") 

    def authenticatedReceive: Receive 
} 

class Worker extends AuthenticatingActor with Actor { 
    def authenticatedReceive: Receive = //.. 
} 

class AuthenticationActor extends Actor { 
    val authenticationService = //.. 
    var worker: ActorRef = _ 

    def receive = { 
    case Authenticate(username, password) => 
     val token = authenticationService.authenticate(username, password) 
     sender ! token.map(AuthenticationSuccess(_, worker). 
        getOrElse(AuthenticationFailure) 
    //.. 
} 
+0

谢谢! - 你的回答给了我另一个想法:如何通过actorOf()简单地给工作演员一个长而安全的随机(标记类)名称,并且真的只是将ActorRef返回给它而不是使用额外的令牌? - 或者这是一个愚蠢的想法? – 2012-08-12 14:43:28

+0

嗯 - 我认为你的员工仍然使用可发现'actorSystem.actorSelection' – sourcedelica 2012-08-12 14:51:01

+1

你说得对,我没有想到这一点。那么显式标记就是。 – 2012-08-12 14:57:23