認証の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から、アクションへパラメータを渡します。