From 91285f8b8ac9ff9e68f811638bcc6be5bc1a902b Mon Sep 17 00:00:00 2001 From: vlad Date: Fri, 3 Feb 2017 15:59:33 -0500 Subject: Abstracting out Authorization rules and passing it ServiceRequestContext --- src/main/scala/xyz/driver/core/rest.scala | 9 ++++++--- src/test/scala/xyz/driver/core/AuthTest.scala | 10 ++++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/scala/xyz/driver/core/rest.scala b/src/main/scala/xyz/driver/core/rest.scala index fd6763e..675e76c 100644 --- a/src/main/scala/xyz/driver/core/rest.scala +++ b/src/main/scala/xyz/driver/core/rest.scala @@ -70,12 +70,17 @@ object rest { val SetAuthenticationTokenHeader = "set-authorization" } + trait Authorization { + def userHasPermission(user: User, permission: Permission)(implicit ctx: ServiceRequestContext): Future[Boolean] + } + trait AuthProvider[U <: User] { import akka.http.scaladsl.server._ import Directives._ protected implicit val execution: ExecutionContext + protected val authorization: Authorization /** * Specific implementation on how to extract user from request context, @@ -86,8 +91,6 @@ object rest { */ protected def authenticatedUser(context: ServiceRequestContext): OptionT[Future, U] - protected def userHasPermission(user: U, permission: Permission): Future[Boolean] - def authorize(permissions: Permission*): Directive1[U] = { serviceContext flatMap { ctx => @@ -95,7 +98,7 @@ object rest { userOption.traverse[Future, (U, Boolean)] { user => permissions .toList - .traverse[Future, Boolean](userHasPermission(user, _)) + .traverse[Future, Boolean](authorization.userHasPermission(user, _)(ctx)) .map(results => user -> results.forall(identity)) } }).flatMap { diff --git a/src/test/scala/xyz/driver/core/AuthTest.scala b/src/test/scala/xyz/driver/core/AuthTest.scala index 50c8291..9045832 100644 --- a/src/test/scala/xyz/driver/core/AuthTest.scala +++ b/src/test/scala/xyz/driver/core/AuthTest.scala @@ -8,8 +8,7 @@ import akka.http.scaladsl.testkit.ScalatestRouteTest import org.scalatest.mock.MockitoSugar import org.scalatest.{FlatSpec, Matchers} import xyz.driver.core.auth._ -import xyz.driver.core.rest.AuthProvider -import xyz.driver.core.rest.ServiceRequestContext +import xyz.driver.core.rest.{AuthProvider, Authorization, ServiceRequestContext} import scala.concurrent.Future import scalaz.OptionT @@ -25,8 +24,11 @@ class AuthTest extends FlatSpec with Matchers with MockitoSugar with ScalatestRo override implicit val execution = scala.concurrent.ExecutionContext.global - override protected def userHasPermission(user: User, permission: Permission): Future[Boolean] = { - Future.successful(permission === TestRoleAllowedPermission) + override protected val authorization: Authorization = new Authorization { + override def userHasPermission(user: User, permission: Permission)( + implicit ctx: ServiceRequestContext): Future[Boolean] = { + Future.successful(permission === TestRoleAllowedPermission) + } } override def authenticatedUser(context: ServiceRequestContext): OptionT[Future, User] = OptionT.optionT[Future] { -- cgit v1.2.3