diff options
author | vlad <vlad@driver.xyz> | 2017-03-24 22:01:40 -0700 |
---|---|---|
committer | vlad <vlad@driver.xyz> | 2017-03-24 22:01:40 -0700 |
commit | 244691b58a233b2e4c7042742230245c539fea3d (patch) | |
tree | f2d7109dd0ae1873961eed4ed3d4ed323f65427b | |
parent | d0ed6d305676fa4cc764d3e2c64341158c298a63 (diff) | |
download | driver-core-244691b58a233b2e4c7042742230245c539fea3d.tar.gz driver-core-244691b58a233b2e4c7042742230245c539fea3d.tar.bz2 driver-core-244691b58a233b2e4c7042742230245c539fea3d.zip |
PDW-238 Session validity verification support for `AuthProvider`
-rw-r--r-- | src/main/scala/xyz/driver/core/rest.scala | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/main/scala/xyz/driver/core/rest.scala b/src/main/scala/xyz/driver/core/rest.scala index ad40fee..dd43989 100644 --- a/src/main/scala/xyz/driver/core/rest.scala +++ b/src/main/scala/xyz/driver/core/rest.scala @@ -137,13 +137,28 @@ package rest { */ def authenticatedUser(context: ServiceRequestContext): OptionT[Future, U] + /** + * Specific implementation can verify session expiration and single sign out + * to verify if session is still valid + */ + def isSessionValid(user: U)(context: ServiceRequestContext): Future[Boolean] = Future.successful(true) + + /** + * Verifies if request is authenticated and authorized to have `permissions` + */ def authorize(permissions: Permission*): Directive1[U] = { serviceContext flatMap { ctx => onComplete(authenticatedUser(ctx).run flatMap { userOption => - userOption.traverse[Future, (U, Boolean)] { user => - permissions.toList - .traverse[Future, Boolean](authorization.userHasPermission(user, _)(ctx)) - .map(results => user -> results.forall(identity)) + userOption.traverseM[Future, (U, Boolean)] { user => + isSessionValid(user)(ctx).flatMap { sessionValid => + if(sessionValid) { + permissions.toList + .traverse[Future, Boolean](authorization.userHasPermission(user, _)(ctx)) + .map(results => Option(user -> results.forall(identity))) + } else { + Future.successful(Option.empty[(U, Boolean)]) + } + } } }).flatMap { case Success(Some((user, authorizationResult))) => |