Play framework 2.0 のためのブログです。
Comments

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

Categories: , ,

Leave a Reply