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