aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVlad Uspensky <v.uspenskiy@icloud.com>2017-03-25 14:03:21 -0700
committerGitHub <noreply@github.com>2017-03-25 14:03:21 -0700
commit27ba1f6dc2d58e6e1d33d5b9d1b5b677c451b841 (patch)
tree366f136662d3e33a58017d740667f55ede59b4ae
parentd0ed6d305676fa4cc764d3e2c64341158c298a63 (diff)
parente74e0229b85a2cb85b31c1f9389dada65ec08b7d (diff)
downloaddriver-core-27ba1f6dc2d58e6e1d33d5b9d1b5b677c451b841.tar.gz
driver-core-27ba1f6dc2d58e6e1d33d5b9d1b5b677c451b841.tar.bz2
driver-core-27ba1f6dc2d58e6e1d33d5b9d1b5b677c451b841.zip
Merge pull request #28 from drivergroup/PDW-238v0.10.34
PDW-238 Session validity verification support for `AuthProvider`
-rw-r--r--src/main/scala/xyz/driver/core/rest.scala27
-rw-r--r--src/test/scala/xyz/driver/core/AuthTest.scala17
2 files changed, 32 insertions, 12 deletions
diff --git a/src/main/scala/xyz/driver/core/rest.scala b/src/main/scala/xyz/driver/core/rest.scala
index ad40fee..d3a06d2 100644
--- a/src/main/scala/xyz/driver/core/rest.scala
+++ b/src/main/scala/xyz/driver/core/rest.scala
@@ -132,18 +132,33 @@ package rest {
* Specific implementation on how to extract user from request context,
* can either need to do a network call to auth server or extract everything from self-contained token
*
- * @param context set of request values which can be relevant to authenticate user
+ * @param ctx set of request values which can be relevant to authenticate user
* @return authenticated user
*/
- def authenticatedUser(context: ServiceRequestContext): OptionT[Future, U]
+ def authenticatedUser(implicit ctx: 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)(implicit ctx: ServiceRequestContext): Future[Boolean]
+
+ /**
+ * 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))) =>
diff --git a/src/test/scala/xyz/driver/core/AuthTest.scala b/src/test/scala/xyz/driver/core/AuthTest.scala
index c39d9da..d1a37a2 100644
--- a/src/test/scala/xyz/driver/core/AuthTest.scala
+++ b/src/test/scala/xyz/driver/core/AuthTest.scala
@@ -31,13 +31,18 @@ class AuthTest extends FlatSpec with Matchers with MockitoSugar with ScalatestRo
}
val authStatusService = new AuthProvider[User](authorization, NoLogger) {
- override def authenticatedUser(context: ServiceRequestContext): OptionT[Future, User] = OptionT.optionT[Future] {
- if (context.contextHeaders.keySet.contains(AuthProvider.AuthenticationTokenHeader)) {
- Future.successful(Some(BasicUser(Id[User]("1"), Set(TestRole))))
- } else {
- Future.successful(Option.empty[User])
+
+ override def isSessionValid(user: User)(implicit ctx: ServiceRequestContext): Future[Boolean] =
+ Future.successful(true)
+
+ override def authenticatedUser(implicit ctx: ServiceRequestContext): OptionT[Future, User] =
+ OptionT.optionT[Future] {
+ if (ctx.contextHeaders.keySet.contains(AuthProvider.AuthenticationTokenHeader)) {
+ Future.successful(Some(BasicUser(Id[User]("1"), Set(TestRole))))
+ } else {
+ Future.successful(Option.empty[User])
+ }
}
- }
}
import authStatusService._