2013-08-08 3 views
1

Я пытаюсь написать страницу editUser с помощью плагина Secure Social, реализованного в приложении Play Framework. У меня возникли проблемы с регистрацией после изменения имени пользователя. Проблема возникает, когда я нажимаю кнопку отправки для формы editUser после изменения имени пользователя. Он переходит на страницу входа и говорит: «Вам нужно войти в систему, чтобы получить доступ к этой странице». Желаемое поведение - перенаправить на страницу editUser без необходимости переустройства. В базе данных все успешно обновляется. Так что это работает, он больше не вошел в систему.Как обновить имя пользователя securesocial после создания пользователя

Ниже приведен мой метод контроллера для моего «User» контроллера для POST обновления пользователя.

Если кто-то может помочь мне с этим, мы будем признательны. Благодарю.

// The form uses the following case class 
case class AccountInfo(userName: String, firstName: String, lastName: String, email: Option[String]) 

def update(username: String) = SecuredAction { implicit request => 
    this.editAccountForm.bindFromRequest.fold (
     hasErrors = { info => 
     Redirect(routes.Users.edit()).flashing(Flash(editAccountForm.data) + 
      ("error" -> Messages("validation.errors"))) 
     }, 
     success = { info => 
     DB.withSession { implicit s: Session => 
      val uid = User.currentUser(request.user.id.id,providerId).get.uid 
      User.update(uid, info, providerId) 
     } 
     val message = Messages("user.update.success") 

     Redirect(routes.Users.edit()).flashing("success" -> message) 
      .withCookies(request.cookies.get("id").get) 
     } 
    ) 
    } 

ответ

1

Изменив имя пользователя, вы меняете значения, используемые для идентификации пользователя (имя пользователя + идентификатор поставщика). Что происходит, так это то, что при следующем запросе SecureSocial ищет старое имя пользователя и, поскольку он не может найти его в базе данных, он просто вышвырнет вас.

Что нужно сделать, кроме обновления базы данных, - обновить аутентификатор, сохраненный для текущего сеанса. Что-то вроде:

SecureSocial.authenticatorFromRequest(request).map { authenticator => 
    val newId = request.user.id.copy(id = userName) 
    Authenticator.save(authenticator.copy(userId = newId)) 
} 

Это должно заставить его работать. Кроме того, вам не нужно добавлять файлы cookie id в свой Redirect. SecureSocial делает это за вас.

+0

Спасибо за ваш ответ Хорхе. Я попробовал это. Я обновил свойства, чтобы отразить изменения в новом securesocial update. Это не сработало. Я поместил кодовый блок непосредственно перед перенаправлением (routes.Users.edit()). Мигает (сообщение «success» ->). Любая идея, что происходит? Благодаря! – danielbh

+0

ОК, наконец, получил это! Еще раз спасибо! – danielbh

Смежные вопросы