in example below, intent build simple play2-auth
program authenticates user keeps session until log out.
problem following compilation error in managesession.scala
:
object creation impossible, since: has 6 unimplemented members
this source code, took sample play2-auth
website , simplified, function signatures same:
authconfigimpl.scala:
import play.api.mvc._ import scala.reflect._ import play.api.mvc.requestheader import play.api.http.status import play.api.mvc.results._ import jp.t2v.lab.play2.auth._ trait authconfigimpl extends authconfig { type id = string type user = account val idtag: classtag[id] = classtag[id] val sessiontimeoutinseconds: int = 3600 def loginsucceeded(request: requestheader): result = redirect("/main",status.ok) def logoutsucceeded(request: requestheader): result = redirect("/main",status.ok) def authenticationfailed(request: requestheader): result = redirect("/main",status.ok) def authorizationfailed(request: requestheader): result = forbidden("no permission") def authorize(user: user, authority: authority): boolean = true //override lazy val cookiesecureoption: boolean = // play.api.play.current.configuration.getboolean("auth.cookie.secure").getorelse(true) }
managesession.scala:
import play.api.mvc._ import play.api.data._ import play.api.data.forms._ import scala.concurrent.executioncontext.implicits.global import jp.t2v.lab.play2.auth._ object managesession extends controller loginlogout authconfigimpl { val loginform = form { mapping("email" -> email, "password" -> text)(account.authenticate) (_.map(u => (u.email, ""))) .verifying("invalid email or password", result => result.isdefined) } def login = action { implicit request => ok(views.html.showlogin()) } def logout = action { implicit request => //gotologoutsucceeded ok("logged out") } def authenticate = action { implicit request => loginform.bindfromrequest.fold( formwitherrors => badrequest(views.html.showlogin()), user => ok("logged in") // gotologinsucceeded(user.get.email) ) } }
account.scala:
case class account(id: int, email: string, password: string, name: string) object account { def authenticate(email: string, password: string): option[account] = { if (email == "test") some(account (1, "test", "abc", "paul")) else none }
gotologinsucceeded
, gotologoutsucceeded
in play2-auth return future[result]
, action
expects result
. can fix using action.async
:
def logout = action.async { implicit request => // something... gotologoutsucceeded } import scala.concurrent.future def authenticate = action.async { implicit request => loginform.bindfromrequest.fold( formwitherrors => future.successful(badrequest(views.html.showlogin())), user => gotologinsucceeded(user.get.id) ) }
the same must done authconfig
. of these methods expected return future[result]
. example
def loginsucceeded(request: requestheader): future[result] = future.successful(redirect("/main", status.ok))
and on.