我正在尝试为Security.authenticated的非String版本实现一个通用的身份验证特性。如果身份验证成功,我希望返回Person的实例,而不是默认的String(例如用户名)。到目前为止,代码是这样的:
trait Secured {
def withPerson[Person](f: => Person => Request[AnyContent] => Result) = {
def findPerson(request:RequestHeader) : Option[Person] =
Person.findByRuid("me")
def noPerson(request:RequestHeader) = Results.BadRequest("No access")
Security.Authenticated[Person](findPerson, noPerson) { person =>
Action { implicit request =>
f(person)(request)
}
}
}
}
Person.findByRuid
在models包中定义为返回Option[Person]
,所以我认为这很简单,但遇到了某种类型参数/类型路径问题,并在调用我的模型方法的线路上收到以下编译时错误消息:
type mismatch;
found : Option[models.Person]
required: Option[Person]
我似乎在Scala类型的教育中错过了一些东西,希望能得到帮助。我如何将我的模特联系起来。具有Person类型参数的Person?
要解决您的问题,只需远程使用Person 中的类型参数
def withPerson(f: => Person => Request[AnyContent] => Result)
正如您所看到的,没有必要这样做,Person已经定义好了。
如果你想定义一个通用的安全特征,你可以做一些类似的事情
trait Secured[A] {
def validate(request:RequestHeader) : Option[A]
def secure(f: => A => Request[AnyContent] => Result) = {
def notAllowed(request:RequestHeader) = Results.BadRequest("No access")
Security.Authenticated[A](validate, notAllowed) { a =>
Action { implicit request =>
f(a)(request)
}
}
}
}
trait SecuredWithPerson extends Secured[Person] {
def validate(request:RequestHeader) : Option[Person] =
Person.findByRuid("me")
}