4

我正在运行 Akka 2.0.2 微内核并希望为不受信任的远程参与者实施身份验证方案。

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

但是,我应该如何保护工作演员不被简单地通过 actorFor() 直接远程查找,从而完全绕过身份验证?

也就是说,我想防止远程参与者在未经身份验证的情况下访问我的微内核参与者系统中的参与者。

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

4

1 回答 1

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)
    //..
}
于 2012-08-12T13:42:43.133 回答