制作play2-auth标准样本

时间:2016-06-07 11:20:11

标签: scala playframework playframework-2.0

我正在努力使play2-auth标准样本工作,不包括授权 - 只是身份验证/登录。

我在@helper.form行中遇到以下错误:

  

类型不匹配;发现:play.api.mvc.Action [play.api.mvc.AnyContent]   必需:play.api.mvc.Call

@(form: Form[Option[session2.Account]])(implicit flash: Flash)
<!DOCTYPE html>

<html>
<head>
    <title>Login</title>
</head>
<body>

  @helper.form(session2.ManageSession.authenticate) {  // <-- here's the error

    <h1>Sign in</h1>

    @form.globalError.map { error =>
      <p class="error">
        @error.message
      </p>
    }
    @flash.get("success").map { message =>
      <p class="success">
        @message
      </p>
    }

    <p>
      <input type="email" name="email" placeholder="Email" id="email" 
            value="@form("email").value">
    </p>
    <p>
      <input type="password" name="password" id="password" placeholder="Password">
    </p>
    <p>
      <button type="submit" id="loginbutton">Login</button>
    </p>
  }
  </body>
</html>

这是ManageSession.scala:

package session2

import play.api.mvc._
import play.api.data._
import play.api.data.Forms._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
import jp.t2v.lab.play2.auth._


object ManageSession extends Controller with LoginLogout with AuthConfigImpl {

  val loginForm = Form {
    mapping("email" -> text, "password" -> text)(Account.authenticate)
       (_.map(u => (u.email, "")))
      .verifying("Invalid email or password", result => result.isDefined)
  }

  def login = Action { implicit request =>
    Ok(views.html.login(loginForm))
  }

  def logout = Action.async { implicit request =>
    // do something...
    gotoLogoutSucceeded
  }


  def authenticate = Action.async { implicit request =>
      loginForm.bindFromRequest.fold(
        formWithErrors => Future.successful(BadRequest(views.html.main())),
        user => gotoLoginSucceeded(user.get.email)
      )
  }

}

1 个答案:

答案 0 :(得分:1)

您目前正在向Action的{​​{1}}实例传递表单模板助手,而不是应由Call生成的reverse route实例。 authenticate描述了路径文件中定义的操作的网址和方法,因此您无需在任何地方对其进行硬编码。

首先,将Call控制器放在ManageSession包中(根据Play的默认设置 - 您可以稍后移动它,但我认为反向路由生成依赖于它们在那里或在子包中。):

controllers

您的package controllers ... object ManageSession extends Controller with LoginLogout with AuthConfigImpl { ... } 文件应如下所示:

conf/routes

然后将在POST /authenticate controllers.ManageSession.authenticate

中生成反向路由Call对象
controllers.routes.ManageSession.authenticate

请注意 @helper.form(controllers.routes.ManageSession.authenticate) { ... } 子包!

结果应该是HTML生成的:

routes

注意:在Play 2.5及更高版本中,不建议使用静态(对象)控制器,也不能使用默认(注入)路由生成器。在这种情况下,最简单的选择就是使<form method="POST" action="/authenticate"> ... </form> 成为一个类而不是一个对象:

ManageSession

或者,您可以指定希望class ManageSession() extends Controller with LoginLogout with AuthConfigImpl { ... } 中的StaticRoutesGenerator

build.sbt