2016-03-23 3 views
0

String以外のバージョンのSecurity.authenticatedに対して共通の認証特性を実装しようとしています。デフォルトのString(ユーザー名など)ではなく、認証が成功した場合はPersonのインスタンスを返すようにします。コードは、これまでのところ、このようなものです:"type mismatch"型のSecurity.authenticatedを実装しました

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.findByRuidOption[Person]を返すために、モデルのパッケージで定義されているので、私は、これは単純なことだろうが、typeパラメータ/タイプパスの問題のいくつかの並べ替えを打っています、と受け取る考えました私のモデルメソッドを呼び出す行に、次のコンパイル時のエラーメッセージ:

type mismatch; 
    found : Option[models.Person] 
    required: Option[Person] 

は私がいるようですが、私のScalaの型教育で何かを見逃しているし、助けをいただければ幸いです。私のmodels.PersonをPerson型パラメータに関連付けるにはどうすればいいですか?あなたはそのための必要はありません見ることができるように、単にリモートwithPerson

def withPerson(f: => Person => Request[AnyContent] => Result) 

内の型パラメータを、あなたの問題を解決するために

答えて

1

は、人がすでに定義されています。

あなたが

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") 
} 
+0

優秀ような何かを行うことができ、一般的なセキュリティで保護された形質を定義したい場合は、あなたに感謝。どうにかして、型パラメータを入れて固定していた署名を見てください。 – wwkudu

+0

あなたは歓迎です、Scalaを楽しんでください –

関連する問題