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

認証のFilter処理で、TraitとActionでデータを渡す方法を実装
http://play-gf.blogspot.jp/2015/03/actionfilter.html の続編的記事です

■ AuthTrait.scala

  1. package controllers.components.actions  
  2.   
  3. import models._  
  4. import play.api.data.Form  
  5. import play.api.data.Forms._  
  6. import play.api.db.slick._  
  7. import play.api.mvc._  
  8. import play.api.Play.current  
  9. import scala.collection.mutable.HashMap  
  10.   
  11. import scala.concurrent.Future  
  12.   
  13. /** 
  14.  * Created by yusuke on 2015/01/23. 
  15.  */  
  16. trait AuthTrait extends Controller{  
  17.   
  18.   class AuthRequest[A](val user: User, request: Request[A]) extends WrappedRequest[A](request)  
  19.   
  20.   // ログインページヘのリダイレクト  
  21.   def redirectToLogin = Action{  
  22.     Redirect(controllers.routes.Secure.login())  
  23.   }  
  24.   
  25.   case class Auth[A](action: Action[A]) extends Action[A] {  
  26.   
  27.     case class AuthEntity(token: String)  
  28.     val auth_form = Form(mapping("token" -> text)(AuthEntity.apply)(AuthEntity.unapply))  
  29.   
  30.     def apply(request: Request[A]): Future[Result] = {  
  31.       DB.withSession {implicit session =>  
  32.         val authEntity = auth_form.bindFromRequest()(request).get  
  33.         val userdata: Option[User] = Users.findByToken(authEntity.token)  
  34.   
  35.         userdata match {  
  36.           case Some(u) =>action(new AuthRequest(u, request)) // ユーザーが見った場合、リクエストをラップして渡す  
  37.           case None => redirectToLogin(request.asInstanceOf[Request[play.api.mvc.AnyContent]]) // ユーザーが見つかっていない場合は、ログインページヘリダイレクト  
  38.         }  
  39.       }  
  40.     }  
  41.     lazy val parser = action.parser  
  42.   }  
  43.   
  44. }  
■ Application.Scala
  1. package controllers  
  2.   
  3. import controllers.components.actions.AuthTrait  
  4. import models._  
  5. import play.api.mvc._  
  6. import play.api.db.slick._  
  7. import play.api.Play.current  
  8.   
  9.   
  10. object Application extends Controller with AuthTrait{  
  11.   
  12.   // 通常のActionを利用した場合  
  13.   def index = Auth {  
  14.     Action { implicit request =>  
  15.       val user = request.asInstanceOf[AuthRequest[AnyContent]].user  
  16.       Ok(user.toString)  
  17.     }  
  18.   }  
  19.   
  20.   // SlickのDBActionを利用した場合  
  21.   def index2 = Auth {  
  22.     DBAction { implicit rc =>  
  23.       val user = rc.request.asInstanceOf[AuthRequest[AnyContent]].user  
  24.       Ok( user.toString )  
  25.     }  
  26.   }  
  27.   
  28. }  

こんな形で、Traitで定義したFilterから、アクションへパラメータを渡します。

Categories: , ,

Leave a Reply