2016-03-23 2 views
0

Ich versuche, ein gemeinsames Authentifizierungsmerkmal für eine Nicht-String-Version von Security.authenticated zu implementieren. Ich möchte eine Instanz einer Person zurückgeben, wenn die Authentifizierung erfolgreich ist, und nicht die Standardzeichenfolge (z. B. Benutzername). Code ist so etwas wie dies bisher:"type mishmatch" implementiert typisierte 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.findByRuid in den Modellen Paket definiert ist ein Option[Person] zurückzukehren, so dachte ich, das wäre einfach, aber ich bin eine Art von Typ-Parameter/Typ Pfad Problem schlagen und erhalten die folgende Kompilierung-Fehlermeldung auf der Linie mein Modell-Methode aufrufen:

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

scheine ich etwas verpasst in meiner Scala Art Ausbildung zu haben und Hilfe schätzen würde. Wie verknüpfe ich meine models.Person mit dem Person type-Parameter?

Antwort

1

Ihr Problem zu lösen nur Fernbedienung, um den Typ-Parameter in withPerson

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

Wie Sie keine Notwendigkeit besteht, für die sehen können, ist Person bereits definiert.

Wenn Sie ein generisches sicheres Merkmal definieren Sie so etwas wie

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

Excellent tun konnten, danke. Irgendwie sah ich mir die Signatur an, auf die ich den Typ-Parameter gesetzt hatte. – wwkudu

+0

Sie sind willkommen, genießen Sie Scala –