認証のFilter処理で、TraitとActionでデータを渡す方法を実装
http://play-gf.blogspot.jp/2015/03/actionfilter.html の続編的記事です
■ AuthTrait.scala
package controllers.components.actions import models._ import play.api.data.Form import play.api.data.Forms._ import play.api.db.slick._ import play.api.mvc._ import play.api.Play.current import scala.collection.mutable.HashMap import scala.concurrent.Future /** * Created by yusuke on 2015/01/23. */ trait AuthTrait extends Controller{ class AuthRequest[A](val user: User, request: Request[A]) extends WrappedRequest[A](request) // ログインページヘのリダイレクト def redirectToLogin = Action{ Redirect(controllers.routes.Secure.login()) } case class Auth[A](action: Action[A]) extends Action[A] { case class AuthEntity(token: String) val auth_form = Form(mapping("token" -> text)(AuthEntity.apply)(AuthEntity.unapply)) def apply(request: Request[A]): Future[Result] = { DB.withSession {implicit session => val authEntity = auth_form.bindFromRequest()(request).get val userdata: Option[User] = Users.findByToken(authEntity.token) userdata match { case Some(u) =>action(new AuthRequest(u, request)) // ユーザーが見った場合、リクエストをラップして渡す case None => redirectToLogin(request.asInstanceOf[Request[play.api.mvc.AnyContent]]) // ユーザーが見つかっていない場合は、ログインページヘリダイレクト } } } lazy val parser = action.parser } }■ Application.Scala
package controllers import controllers.components.actions.AuthTrait import models._ import play.api.mvc._ import play.api.db.slick._ import play.api.Play.current object Application extends Controller with AuthTrait{ // 通常のActionを利用した場合 def index = Auth { Action { implicit request => val user = request.asInstanceOf[AuthRequest[AnyContent]].user Ok(user.toString) } } // SlickのDBActionを利用した場合 def index2 = Auth { DBAction { implicit rc => val user = rc.request.asInstanceOf[AuthRequest[AnyContent]].user Ok( user.toString ) } } }
こんな形で、Traitで定義したFilterから、アクションへパラメータを渡します。