技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

ログイン必須のアクション定義

ログインしてなかったら…という処理は皆書く筈。

Playframework 2.1 あたりから Security クラスが出来たらしい。

当然 2.2 でも使えるのでメモ。

package controllers.helpers

import play.api.mvc._
import controllers.routes

trait LoginController {
  self: Controller =>

  private val LOGIN_SESSION_KEY = "login.session.key"

  /**
   * Login or redirect to index.
   * @param parser
   * @param f
   * @tparam A
   * @return
   */
  def authAction[A](parser: BodyParser[A])(f: Request[A] => Result) = Security.Authenticated(getLoginId, onUnauthorised) { user =>
    Action(parser)(f)
  }

  /**
   * @see loginAction
   * @param f
   * @return
   */
  def authAction(f: Request[AnyContent] => Result) = authAction(BodyParsers.parse.anyContent)(f)

  /**
   * Get login session.
   * @param request
   * @return
   */
  private def getLoginId(request: RequestHeader) = session.get(LOGIN_SESSION_KEY)

  /**
   * Get login session.
   * @param request
   * @return
   */
  def loginId(implicit request: RequestHeader) = getLoginId(request)

  /**
   * Handled when unauthorised.
   * @param request
   * @return
   */
  def onUnauthorised(request: RequestHeader) =
    Results.Redirect(routes.Application.index().url).flashing(("message", "Require login"))
}

コピペで使える安心仕様。

object Application extends Controller with LoginController {
  def about = authAction { implicit request:Request[AnyContent] =>
    // ... 略
  }
}

素で書いてもそんな変わらないかも?とか思った。