【问题标题】:Basic authentication with play2-auth in Play 2.5.x在 Play 2.5.x 中使用 play2-auth 进行基本身份验证
【发布时间】:2016-06-07 10:50:21
【问题描述】:

在下面的示例中,目的是构建一个简单的play2-auth 程序,用于对用户进行身份验证,并在他们注销之前保持会话。

问题是我在ManageSession.scala 中得到以下编译错误:

无法创建对象,因为:它有 6 个未实现的成员

这是源代码,我从play2-auth网站上拿了样例并简化了,但是函数签名是一样的:

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 with LoginLogout with 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
  }

【问题讨论】:

    标签: scala playframework playframework-2.0


    【解决方案1】:

    gotoLoginSucceededgotoLogoutSucceeded 在 play2-auth 中返回 Future[Result],但 Action 需要 Result。您可以使用Action.async 解决此问题:

    def logout = Action.async { implicit request =>
      // do 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)
      )
    }
    

    您的AuthConfig 也必须这样做。所有这些方法都应返回Future[Result]。例如

    def loginSucceeded(request: RequestHeader): Future[Result] = 
        Future.successful(Redirect("/main", Status.OK))
    

    等等。

    【讨论】:

    • 谢谢,我在 ManageSession 声明中仍然遇到错误:object creation impossible, since: it has 6 unimplemented members. /** As seen from object ManageSession, the missing signatures are as follows. * For convenience, these are usable as stub implementations. */ def authenticationFailed(request: play.api.mvc.RequestHeader)(implicit context: scala.concurrent.ExecutionContext): scala.concurrent.Future[play.api.mvc.Result] = ??? def authorizationFailed(request: play.api.mvc.RequestHeader,user: session.ManageSession.User,authority: Option[session.ManageSession.Authority])...
    • 缺少 ExecutionContext。应该是这样定义的:def loginSucceeded(request: RequestHeader)(implicit context: ExecutionContext): Future[Result] = Future.successful(Redirect("/main", Status.OK))
    猜你喜欢
    • 1970-01-01
    • 2015-08-12
    • 2017-06-13
    • 2013-05-30
    • 2021-09-23
    • 2016-05-31
    • 2017-10-06
    • 2013-09-14
    • 2010-12-11
    相关资源
    最近更新 更多