Skip to content

Commit

Permalink
Merge pull request mohiva#71 from akkie/master
Browse files Browse the repository at this point in the history
Update to Silhouette 4.0.0-BETA4
  • Loading branch information
akkie committed Mar 31, 2016
2 parents 200b724 + 83dd3fe commit 2fbadbf
Show file tree
Hide file tree
Showing 22 changed files with 218 additions and 568 deletions.
52 changes: 14 additions & 38 deletions app/controllers/ApplicationController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,70 +2,46 @@ package controllers

import javax.inject.Inject

import com.mohiva.play.silhouette.api.{ Environment, LogoutEvent, Silhouette }
import com.mohiva.play.silhouette.impl.authenticators.CookieAuthenticator
import com.mohiva.play.silhouette.api.{ LogoutEvent, Silhouette }
import com.mohiva.play.silhouette.impl.providers.SocialProviderRegistry
import forms._
import models.User
import play.api.i18n.MessagesApi
import play.api.i18n.{ I18nSupport, MessagesApi }
import play.api.mvc.Controller
import utils.auth.DefaultEnv

import scala.concurrent.Future

/**
* The basic application controller.
*
* @param messagesApi The Play messages API.
* @param env The Silhouette environment.
* @param silhouette The Silhouette stack.
* @param socialProviderRegistry The social provider registry.
* @param webJarAssets The webjar assets implementation.
*/
class ApplicationController @Inject() (
val messagesApi: MessagesApi,
val env: Environment[User, CookieAuthenticator],
socialProviderRegistry: SocialProviderRegistry)
extends Silhouette[User, CookieAuthenticator] {
silhouette: Silhouette[DefaultEnv],
socialProviderRegistry: SocialProviderRegistry,
implicit val webJarAssets: WebJarAssets)
extends Controller with I18nSupport {

/**
* Handles the index action.
*
* @return The result to display.
*/
def index = SecuredAction.async { implicit request =>
def index = silhouette.SecuredAction.async { implicit request =>
Future.successful(Ok(views.html.home(request.identity)))
}

/**
* Handles the Sign In action.
*
* @return The result to display.
*/
def signIn = UserAwareAction.async { implicit request =>
request.identity match {
case Some(user) => Future.successful(Redirect(routes.ApplicationController.index()))
case None => Future.successful(Ok(views.html.signIn(SignInForm.form, socialProviderRegistry)))
}
}

/**
* Handles the Sign Up action.
*
* @return The result to display.
*/
def signUp = UserAwareAction.async { implicit request =>
request.identity match {
case Some(user) => Future.successful(Redirect(routes.ApplicationController.index()))
case None => Future.successful(Ok(views.html.signUp(SignUpForm.form)))
}
}

/**
* Handles the Sign Out action.
*
* @return The result to display.
*/
def signOut = SecuredAction.async { implicit request =>
def signOut = silhouette.SecuredAction.async { implicit request =>
val result = Redirect(routes.ApplicationController.index())
env.eventBus.publish(LogoutEvent(request.identity, request, request2Messages))

env.authenticatorService.discard(request.authenticator, result)
silhouette.env.eventBus.publish(LogoutEvent(request.identity, request))
silhouette.env.authenticatorService.discard(request.authenticator, result)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,51 +7,61 @@ import com.mohiva.play.silhouette.api._
import com.mohiva.play.silhouette.api.exceptions.ProviderException
import com.mohiva.play.silhouette.api.repositories.AuthInfoRepository
import com.mohiva.play.silhouette.api.util.{ Clock, Credentials }
import com.mohiva.play.silhouette.impl.authenticators.CookieAuthenticator
import com.mohiva.play.silhouette.impl.exceptions.IdentityNotFoundException
import com.mohiva.play.silhouette.impl.providers._
import forms.SignInForm
import models.User
import models.services.UserService
import net.ceedubs.ficus.Ficus._
import play.api.Configuration
import play.api.i18n.{ Messages, MessagesApi }
import play.api.i18n.{ I18nSupport, Messages, MessagesApi }
import play.api.libs.concurrent.Execution.Implicits._
import play.api.mvc.Action
import play.api.mvc.Controller
import utils.auth.DefaultEnv

import scala.concurrent.Future
import scala.concurrent.duration._
import scala.language.postfixOps

/**
* The credentials auth controller.
* The `Sign In` controller.
*
* @param messagesApi The Play messages API.
* @param env The Silhouette environment.
* @param silhouette The Silhouette stack.
* @param userService The user service implementation.
* @param authInfoRepository The auth info repository implementation.
* @param credentialsProvider The credentials provider.
* @param socialProviderRegistry The social provider registry.
* @param configuration The Play configuration.
* @param clock The clock instance.
* @param webJarAssets The webjar assets implementation.
*/
class CredentialsAuthController @Inject() (
class SignInController @Inject() (
val messagesApi: MessagesApi,
val env: Environment[User, CookieAuthenticator],
silhouette: Silhouette[DefaultEnv],
userService: UserService,
authInfoRepository: AuthInfoRepository,
credentialsProvider: CredentialsProvider,
socialProviderRegistry: SocialProviderRegistry,
configuration: Configuration,
clock: Clock)
extends Silhouette[User, CookieAuthenticator] {
clock: Clock,
implicit val webJarAssets: WebJarAssets)
extends Controller with I18nSupport {

/**
* Authenticates a user against the credentials provider.
* Views the `Sign In` page.
*
* @return The result to display.
*/
def authenticate = Action.async { implicit request =>
def view = silhouette.UnsecuredAction.async { implicit request =>
Future.successful(Ok(views.html.signIn(SignInForm.form, socialProviderRegistry)))
}

/**
* Handles the submitted form.
*
* @return The result to display.
*/
def submit = silhouette.UnsecuredAction.async { implicit request =>
SignInForm.form.bindFromRequest.fold(
form => Future.successful(BadRequest(views.html.signIn(form, socialProviderRegistry))),
data => {
Expand All @@ -61,7 +71,7 @@ class CredentialsAuthController @Inject() (
userService.retrieve(loginInfo).flatMap {
case Some(user) =>
val c = configuration.underlying
env.authenticatorService.create(loginInfo).map {
silhouette.env.authenticatorService.create(loginInfo).map {
case authenticator if data.rememberMe =>
authenticator.copy(
expirationDateTime = clock.now + c.as[FiniteDuration]("silhouette.authenticator.rememberMe.authenticatorExpiry"),
Expand All @@ -70,16 +80,16 @@ class CredentialsAuthController @Inject() (
)
case authenticator => authenticator
}.flatMap { authenticator =>
env.eventBus.publish(LoginEvent(user, request, request2Messages))
env.authenticatorService.init(authenticator).flatMap { v =>
env.authenticatorService.embed(v, result)
silhouette.env.eventBus.publish(LoginEvent(user, request))
silhouette.env.authenticatorService.init(authenticator).flatMap { v =>
silhouette.env.authenticatorService.embed(v, result)
}
}
case None => Future.failed(new IdentityNotFoundException("Couldn't find user"))
}
}.recover {
case e: ProviderException =>
Redirect(routes.ApplicationController.signIn()).flashing("error" -> Messages("invalid.credentials"))
Redirect(routes.SignInController.view()).flashing("error" -> Messages("invalid.credentials"))
}
}
)
Expand Down
43 changes: 27 additions & 16 deletions app/controllers/SignUpController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,49 +7,60 @@ import com.mohiva.play.silhouette.api._
import com.mohiva.play.silhouette.api.repositories.AuthInfoRepository
import com.mohiva.play.silhouette.api.services.AvatarService
import com.mohiva.play.silhouette.api.util.PasswordHasher
import com.mohiva.play.silhouette.impl.authenticators.CookieAuthenticator
import com.mohiva.play.silhouette.impl.providers._
import forms.SignUpForm
import models.User
import models.services.UserService
import play.api.i18n.{ MessagesApi, Messages }
import play.api.i18n.{ I18nSupport, Messages, MessagesApi }
import play.api.libs.concurrent.Execution.Implicits._
import play.api.mvc.Action
import play.api.mvc.Controller
import utils.auth.DefaultEnv

import scala.concurrent.Future

/**
* The sign up controller.
* The `Sign Up` controller.
*
* @param messagesApi The Play messages API.
* @param env The Silhouette environment.
* @param silhouette The Silhouette stack.
* @param userService The user service implementation.
* @param authInfoRepository The auth info repository implementation.
* @param avatarService The avatar service implementation.
* @param passwordHasher The password hasher implementation.
* @param webJarAssets The webjar assets implementation.
*/
class SignUpController @Inject() (
val messagesApi: MessagesApi,
val env: Environment[User, CookieAuthenticator],
silhouette: Silhouette[DefaultEnv],
userService: UserService,
authInfoRepository: AuthInfoRepository,
avatarService: AvatarService,
passwordHasher: PasswordHasher)
extends Silhouette[User, CookieAuthenticator] {
passwordHasher: PasswordHasher,
implicit val webJarAssets: WebJarAssets)
extends Controller with I18nSupport {

/**
* Registers a new user.
* Views the `Sign Up` page.
*
* @return The result to display.
*/
def signUp = Action.async { implicit request =>
def view = silhouette.UnsecuredAction.async { implicit request =>
Future.successful(Ok(views.html.signUp(SignUpForm.form)))
}

/**
* Handles the submitted form.
*
* @return The result to display.
*/
def submit = silhouette.UnsecuredAction.async { implicit request =>
SignUpForm.form.bindFromRequest.fold(
form => Future.successful(BadRequest(views.html.signUp(form))),
data => {
val loginInfo = LoginInfo(CredentialsProvider.ID, data.email)
userService.retrieve(loginInfo).flatMap {
case Some(user) =>
Future.successful(Redirect(routes.ApplicationController.signUp()).flashing("error" -> Messages("user.exists")))
Future.successful(Redirect(routes.SignUpController.view()).flashing("error" -> Messages("user.exists")))
case None =>
val authInfo = passwordHasher.hash(data.password)
val user = User(
Expand All @@ -65,12 +76,12 @@ class SignUpController @Inject() (
avatar <- avatarService.retrieveURL(data.email)
user <- userService.save(user.copy(avatarURL = avatar))
authInfo <- authInfoRepository.add(loginInfo, authInfo)
authenticator <- env.authenticatorService.create(loginInfo)
value <- env.authenticatorService.init(authenticator)
result <- env.authenticatorService.embed(value, Redirect(routes.ApplicationController.index()))
authenticator <- silhouette.env.authenticatorService.create(loginInfo)
value <- silhouette.env.authenticatorService.init(authenticator)
result <- silhouette.env.authenticatorService.embed(value, Redirect(routes.ApplicationController.index()))
} yield {
env.eventBus.publish(SignUpEvent(user, request, request2Messages))
env.eventBus.publish(LoginEvent(user, request, request2Messages))
silhouette.env.eventBus.publish(SignUpEvent(user, request))
silhouette.env.eventBus.publish(LoginEvent(user, request))
result
}
}
Expand Down
27 changes: 14 additions & 13 deletions app/controllers/SocialAuthController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,33 @@ import javax.inject.Inject
import com.mohiva.play.silhouette.api._
import com.mohiva.play.silhouette.api.exceptions.ProviderException
import com.mohiva.play.silhouette.api.repositories.AuthInfoRepository
import com.mohiva.play.silhouette.impl.authenticators.CookieAuthenticator
import com.mohiva.play.silhouette.impl.providers._
import models.User
import models.services.UserService
import play.api.i18n.{ MessagesApi, Messages }
import play.api.i18n.{ I18nSupport, Messages, MessagesApi }
import play.api.libs.concurrent.Execution.Implicits._
import play.api.mvc.Action
import play.api.mvc.{ Action, Controller }
import utils.auth.DefaultEnv

import scala.concurrent.Future

/**
* The social auth controller.
*
* @param messagesApi The Play messages API.
* @param env The Silhouette environment.
* @param silhouette The Silhouette stack.
* @param userService The user service implementation.
* @param authInfoRepository The auth info service implementation.
* @param socialProviderRegistry The social provider registry.
* @param webJarAssets The webjar assets implementation.
*/
class SocialAuthController @Inject() (
val messagesApi: MessagesApi,
val env: Environment[User, CookieAuthenticator],
silhouette: Silhouette[DefaultEnv],
userService: UserService,
authInfoRepository: AuthInfoRepository,
socialProviderRegistry: SocialProviderRegistry)
extends Silhouette[User, CookieAuthenticator] with Logger {
socialProviderRegistry: SocialProviderRegistry,
implicit val webJarAssets: WebJarAssets)
extends Controller with I18nSupport with Logger {

/**
* Authenticates a user against a social provider.
Expand All @@ -47,19 +48,19 @@ class SocialAuthController @Inject() (
profile <- p.retrieveProfile(authInfo)
user <- userService.save(profile)
authInfo <- authInfoRepository.save(profile.loginInfo, authInfo)
authenticator <- env.authenticatorService.create(profile.loginInfo)
value <- env.authenticatorService.init(authenticator)
result <- env.authenticatorService.embed(value, Redirect(routes.ApplicationController.index()))
authenticator <- silhouette.env.authenticatorService.create(profile.loginInfo)
value <- silhouette.env.authenticatorService.init(authenticator)
result <- silhouette.env.authenticatorService.embed(value, Redirect(routes.ApplicationController.index()))
} yield {
env.eventBus.publish(LoginEvent(user, request, request2Messages))
silhouette.env.eventBus.publish(LoginEvent(user, request))
result
}
}
case _ => Future.failed(new ProviderException(s"Cannot authenticate with unexpected social provider $provider"))
}).recover {
case e: ProviderException =>
logger.error("Unexpected provider error", e)
Redirect(routes.ApplicationController.signIn()).flashing("error" -> Messages("could.not.authenticate"))
Redirect(routes.SignInController.view()).flashing("error" -> Messages("could.not.authenticate"))
}
}
}
Loading

0 comments on commit 2fbadbf

Please sign in to comment.