When user signs in/out, a proper redirect is performed.

This commit is contained in:
Šesták Vít
2016-02-12 20:17:30 +01:00
parent 2fb2c3fd72
commit feeec6aec6
5 changed files with 23 additions and 17 deletions

View File

@@ -30,16 +30,16 @@ class AuthController @Inject() (
"rememberMe" -> boolean "rememberMe" -> boolean
)(LoginRequest.apply)(LoginRequest.unapply)) )(LoginRequest.apply)(LoginRequest.unapply))
def signIn = UserAwareAction { implicit request => def signIn(callback: String) = UserAwareAction { implicit request =>
request.identity match { request.identity match {
case Some(user) => Redirect(routes.Application.index(Map())) case Some(user) => generateCallback(callback)
case None => Ok(views.html.auth.signIn(signInForm/*, socialProviderRegistry*/)) case None => Ok(views.html.auth.signIn(signInForm, callback/*, socialProviderRegistry*/))
} }
} }
def authenticate() = UserAwareAction.async { implicit request => def authenticate(callback: String) = UserAwareAction.async { implicit request =>
signInForm.bindFromRequest().fold( signInForm.bindFromRequest().fold(
formWithErrors => Future.successful(BadRequest(views.html.auth.signIn(formWithErrors/*, socialProviderRegistry*/))), formWithErrors => Future.successful(BadRequest(views.html.auth.signIn(formWithErrors, callback/*, socialProviderRegistry*/))),
loginRequest => { loginRequest => {
credentialsVerificationService.verifyCredentials(loginRequest.username, loginRequest.password).flatMap{ credentialsVerificationService.verifyCredentials(loginRequest.username, loginRequest.password).flatMap{
case Right(email) => case Right(email) =>
@@ -50,18 +50,22 @@ class AuthController @Inject() (
authenticator <- env.authenticatorService.create(loginInfo) authenticator <- env.authenticatorService.create(loginInfo)
_ = env.eventBus.publish(LoginEvent(user, request, implicitly[Messages])) _ = env.eventBus.publish(LoginEvent(user, request, implicitly[Messages]))
res <- env.authenticatorService.init(authenticator).flatMap(cookie => res <- env.authenticatorService.init(authenticator).flatMap(cookie =>
env.authenticatorService.embed(cookie.copy(secure = request.secure), Redirect(routes.Application.index(Map()))) env.authenticatorService.embed(cookie.copy(secure = request.secure), generateCallback(callback))
) )
} yield res } yield res
case Left(errorMessage) => case Left(errorMessage) =>
Future.successful(Redirect(routes.AuthController.signIn()).flashing("error" -> Messages("invalid.credentials"))) Future.successful(Redirect(routes.AuthController.signIn(callback)).flashing("error" -> Messages("invalid.credentials")))
} }
} }
) )
} }
def signOut = SecuredAction.async { implicit request => private def generateCallback(callback: String) = {
val result = Redirect(routes.Application.index(Map())) if (callback startsWith "/") Redirect(callback) else Redirect(routes.Application.index(Map()))
}
def signOut(callback: String) = SecuredAction.async { implicit request =>
val result = generateCallback(callback)
env.eventBus.publish(LogoutEvent(request.identity, request, request2Messages)) env.eventBus.publish(LogoutEvent(request.identity, request, request2Messages))
env.authenticatorService.discard(request.authenticator, result) env.authenticatorService.discard(request.authenticator, result)
} }

View File

@@ -20,7 +20,9 @@ trait AuthenticatedControllerLowPriorityImplicits[T, C]{
abstract class AuthenticatedController extends Silhouette[User, CookieAuthenticator] with AuthenticatedControllerLowPriorityImplicits[User, CookieAuthenticator]{ abstract class AuthenticatedController extends Silhouette[User, CookieAuthenticator] with AuthenticatedControllerLowPriorityImplicits[User, CookieAuthenticator]{
override protected def onNotAuthenticated(request: RequestHeader): Option[Future[Result]] = Some(Future.successful(Redirect(routes.AuthController.signIn()))) override protected def onNotAuthenticated(request: RequestHeader): Option[Future[Result]] = Some(Future.successful(Redirect(
routes.AuthController.signIn(request.path+"?"+request.rawQueryString)
)))
object ReadAction extends SecuredActionBuilder with Results { object ReadAction extends SecuredActionBuilder with Results {

View File

@@ -1,8 +1,8 @@
@import helper._ @import helper._
@(loginForm: Form[LoginRequest]/*, socialProviderRegistry: SocialProviderRegistry*/)(implicit requestHeader: DefaultRequest, messages: Messages) @(loginForm: Form[LoginRequest], callback: String/*, socialProviderRegistry: SocialProviderRegistry*/)(implicit requestHeader: DefaultRequest, messages: Messages)
@main("Log in"){ @main("Log in"){
@form(routes.AuthController.authenticate()){ @form(routes.AuthController.authenticate(callback)){
@CSRF.formField @CSRF.formField
@inputText(loginForm("username")) @inputText(loginForm("username"))
@inputPassword(loginForm("password")) @inputPassword(loginForm("password"))

View File

@@ -74,9 +74,9 @@
</ul> </ul>
<ul class="nav navbar-nav navbar-right"> <ul class="nav navbar-nav navbar-right">
<li>@header.identity.fold{ <li>@header.identity.fold{
<a class="btn btn-default" href="@routes.AuthController.signIn()">Log in</a> <a class="btn btn-default" href="@routes.AuthController.signIn(header.path+"?"+header.rawQueryString)">Log in</a>
}{ user => }{ user =>
@form(routes.AuthController.signOut()){ @form(routes.AuthController.signOut(header.path+"?"+header.rawQueryString)){
@CSRF.formField @CSRF.formField
<button type="submit" class="btn btn-warning">Logout @user.username</button> <button type="submit" class="btn btn-warning">Logout @user.username</button>
} }

View File

@@ -41,9 +41,9 @@ POST /tags/import controllers.Application.tagsImport
GET /routes.js controllers.Application.javascriptRoutes GET /routes.js controllers.Application.javascriptRoutes
GET /sign-in controllers.AuthController.signIn GET /sign-in controllers.AuthController.signIn(callback: String)
POST /sign-in controllers.AuthController.authenticate POST /sign-in controllers.AuthController.authenticate(callback: String)
POST /sign-out controllers.AuthController.signOut POST /sign-out controllers.AuthController.signOut(callback: String)
# Map static resources from the /public folder to the /assets URL path # Map static resources from the /public folder to the /assets URL path
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)