"type mismatch"实现类型化安全性。



我正在尝试为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")
}

最新更新