2012-08-12 75 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