1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Auth @Inject() ( val messagesApi: MessagesApi, val env:Environment[User,CookieAuthenticator], socialProviderRegistry: SocialProviderRegistry, authInfoRepository: AuthInfoRepository, credentialsProvider: CredentialsProvider, userService: UserService, userTokenService: UserTokenService, avatarService: AvatarService, passwordHasher: PasswordHasher, configuration: Configuration, mailer: Mailer) extends Silhouette[User,CookieAuthenticator] { // ... auth controller code ... } |
1 2 3 4 5 6 | def startSignUp = UserAwareAction.async { implicit request => Future.successful(request.identity match { case Some(user) => Redirect(routes.Application.index) case None => Ok(views.html.auth.startSignUp(signUpForm)) }) } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | def handleStartSignUp = Action.async { implicit request => signUpForm.bindFromRequest.fold( bogusForm => Future.successful(BadRequest(views.html.auth.startSignUp(bogusForm))), signUpData => { val loginInfo = LoginInfo(CredentialsProvider.ID, signUpData.email) userService.retrieve(loginInfo).flatMap { case Some(_) => Future.successful(Redirect(routes.Auth.startSignUp()).flashing( "error" -> Messages("error.userExists", signUpData.email))) case None => val profile = Profile( loginInfo = loginInfo, confirmed=false, email=Some(signUpData.email), firstName=Some(signUpData.firstName), lastName=Some(signUpData.lastName), fullName=Some(s"${signUpData.firstName} ${signUpData.lastName}"), passwordInfo = None, oauth1Info = None, avatarUrl = None) for { avatarUrl <- avatarService.retrieveURL(signUpData.email) user <- userService.save(User(id = UUID.randomUUID(), profiles = List(profile.copy(avatarUrl = avatarUrl)))) _ <- authInfoRepository.add(loginInfo, passwordHasher.hash(signUpData.password)) token <- userTokenService.save(UserToken.create(user.id, signUpData.email, true)) } yield { mailer.welcome(profile, link = routes.Auth.signUp(token.id.toString).absoluteURL()) Ok(views.html.auth.finishSignUp(profile)) } } } ) } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | def signUp(tokenId:String) = Action.async { implicit request => val id = UUID.fromString(tokenId) userTokenService.find(id).flatMap { case None => Future.successful(NotFound(views.html.errors.notFound(request))) case Some(token) if token.isSignUp && !token.isExpired => userService.find(token.userId).flatMap { case None => Future.failed(new IdentityNotFoundException(Messages("error.noUser"))) case Some(user) => val loginInfo = LoginInfo(CredentialsProvider.ID, token.email) for { authenticator <- env.authenticatorService.create(loginInfo) value <- env.authenticatorService.init(authenticator) _ <- userService.confirm(loginInfo) _ <- userTokenService.remove(id) result <- env.authenticatorService.embed(value, Redirect(routes.Application.index())) } yield result } case Some(token) => userTokenService.remove(id).map {_ => NotFound(views.html.errors.notFound(request))} } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | def authenticate = Action.async { implicit request => signInForm.bindFromRequest.fold( bogusForm => Future.successful( BadRequest(views.html.auth.signIn(bogusForm, socialProviderRegistry))), signInData => { val credentials = Credentials(signInData.email, signInData.password) credentialsProvider.authenticate(credentials).flatMap { loginInfo => userService.retrieve(loginInfo).flatMap { case None => Future.successful(Redirect(routes.Auth.signIn()) .flashing("error" -> Messages("error.noUser"))) case Some(user) if !user.profileFor(loginInfo).map(_.confirmed).getOrElse(false) => Future.successful(Redirect(routes.Auth.signIn()) .flashing("error" -> Messages("error.unregistered", signInData.email))) case Some(_) => for { authenticator <- env.authenticatorService.create(loginInfo).map { case authenticator if signInData.rememberMe => authenticator.copy(...) // Extend lifetime case authenticator => authenticator } value <- env.authenticatorService.init(authenticator) result <- env.authenticatorService.embed(value, Redirect(routes.Application.index())) } yield result } }.recover { case eroviderException => Redirect(routes.Auth.signIn()).flashing("error" -> Messages("error.invalidCredentials")) } } ) } |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |