Skip to content

Instantly share code, notes, and snippets.

@larryboymi
Last active March 17, 2017 17:24
Show Gist options
  • Save larryboymi/2838db7c476873a71d22 to your computer and use it in GitHub Desktop.
Save larryboymi/2838db7c476873a71d22 to your computer and use it in GitHub Desktop.
Futures-based authorize spray directive
import scala.language.implicitConversions
import spray.routing._
import spray.routing.directives.BasicDirectives._
import spray.routing.directives._
import scala.concurrent.{ExecutionContext, Future}
import FutureDirectives._
trait FutureSecurityDirectives extends SecurityDirectives {
def futureAuthorize(check: AuthorizeMagnet): Directive0 = check.directive
}
class AuthorizeMagnet(authDirective: Directive1[Boolean])(implicit executor: ExecutionContext) extends SecurityDirectives{
val directive: Directive0 = authDirective.flatMap(authorize(_))
}
object AuthorizeMagnet {
implicit def fromFutureAuth(auth: => Future[Boolean])(implicit executor: ExecutionContext): AuthorizeMagnet =
new AuthorizeMagnet(onSuccess(auth))
implicit def fromFutureAuthWithCtx(auth: RequestContext => Future[Boolean])(implicit executor: ExecutionContext): AuthorizeMagnet =
new AuthorizeMagnet(extract(auth).flatMap(onSuccess(_)))
}
@axos88
Copy link

axos88 commented May 27, 2016

Usage:

def canModifyUser(u : String): Future[Boolean] = Future { .... }

val route = 
  path("users" / Segment) { user =>
    post {
      futureAuthorize(canModifyUser(user)) { 
        complete {
          modifyUser(...)
        }
      }
    }
  }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment