aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlad <vlad@driver.xyz>2017-03-24 22:01:40 -0700
committervlad <vlad@driver.xyz>2017-03-24 22:01:40 -0700
commit244691b58a233b2e4c7042742230245c539fea3d (patch)
treef2d7109dd0ae1873961eed4ed3d4ed323f65427b
parentd0ed6d305676fa4cc764d3e2c64341158c298a63 (diff)
downloaddriver-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.scala23
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))) =>