我正在运行Akka 2.0.2微内核,并希望为不受信任的远程角色实施身份验证方案。
首先要想到的是设置一个身份验证actor,它在身份验证成功时返回对工作actor的引用。
但是,我应该如何保护工作人员不仅仅是通过actorFor()直接远程查找,完全绕过身份验证?
也就是说,我想阻止远程actor在没有身份验证的情况下访问我的微内核actor系统中的actor。
在actorOf()中没有给工作者一个名字是不够的,因为它会得到一个容易猜到的自动生成的名字。有没有办法禁用演员的远程查找,但仍能将他们的ActorRef发给远程系统?
答案 0 :(得分:3)
我认为你与身份验证演员一起走在了正确的轨道上。让身份验证actor返回ActorRef和令牌。远程actor必须在消息中包含该令牌给您当地的worker actor。工作者将在完成工作之前验证令牌。
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)
//..
}