From 82317566c7697df5e204aea26050f8e21ee1dc43 Mon Sep 17 00:00:00 2001 From: gakuzzzz Date: Thu, 5 Mar 2015 16:50:08 +0900 Subject: [PATCH] Added AuthorityFactory --- .../scala/jp/t2v/lab/play2/auth/AuthElement.scala | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/module/src/main/scala/jp/t2v/lab/play2/auth/AuthElement.scala b/module/src/main/scala/jp/t2v/lab/play2/auth/AuthElement.scala index 5362a60..dce65ea 100644 --- a/module/src/main/scala/jp/t2v/lab/play2/auth/AuthElement.scala +++ b/module/src/main/scala/jp/t2v/lab/play2/auth/AuthElement.scala @@ -10,12 +10,18 @@ trait AuthElement extends StackableController with AsyncAuth { private[auth] case object AuthKey extends RequestAttributeKey[User] case object AuthorityKey extends RequestAttributeKey[Authority] + private[auth] final case class AuthorityFactoryKey[A]() extends RequestAttributeKey[RequestWithAttributes[A] => Either[Result, Authority]] + def authorityFactoryKey[A]: RequestAttributeKey[RequestWithAttributes[A] => Either[Result, Authority]] = AuthorityFactoryKey() + override def proceed[A](req: RequestWithAttributes[A])(f: RequestWithAttributes[A] => Future[Result]): Future[Result] = { implicit val (r, ctx) = (req, StackActionExecutionContext(req)) - req.get(AuthorityKey) map { authority => - authorized(authority) flatMap { - case Right((user, resultUpdater)) => super.proceed(req.set(AuthKey, user))(f).map(resultUpdater) - case Left(result) => Future.successful(result) + (req.get(AuthorityKey).map(a => (_: RequestWithAttributes[A]) => Right[Result, Authority](a)) orElse req.get(authorityFactoryKey[A])) map { authorityFactory => + authorityFactory(req) match { + case Right(authority) => authorized(authority) flatMap { + case Right((user, resultUpdater)) => super.proceed(req.set(AuthKey, user))(f).map(resultUpdater) + case Left(result) => Future.successful(result) + } + case Left(result) => Future.successful(result) } } getOrElse { restoreUser collect {