Secure Social Play 2.x / Tetap menggunakan pengguna sementara, tidak terdaftar (yaitu belum masuk)?

Saya menggunakan Play Framework (Scala) dan SecureSocial untuk mengautentikasi pengguna.

Saya ingin situs saya mengizinkan pengguna yang tidak masuk untuk menelusuri dan mengisi data pengguna tertentu (misalnya alamat email) selama sesi mereka.

Saya memiliki implementasi UserService khusus yang mempertahankan pengguna yang masuk ke DB (dan objek model User saya sendiri yang mengimplementasikan Sifat securesocial.core.Identity)

Saya memiliki subkelas UnregisteredUser yang ingin saya pertahankan dalam sesi ini saat pengguna tidak masuk.

Apa praktik terbaik untuk ini?


person Chris Beach    schedule 13.05.2013    source sumber


Jawaban (1)


Saya membayangkan tujuan khusus Anda adalah mengumpulkan seluruh data secara efisien relatif terhadap pengguna yang tidak terdaftar di setiap tindakan pengontrol yang Anda minati. Masalah: Kami ingin mengambil build UnregisteredUser secara langsung dengan mengumpulkan semua data ini dalam sesi.

Pertama, pertahankan data UnregisteredUser kapan pun Anda mau dalam sesi menggunakan api dasar Play 2 Sesi :

Ok("Welcome Guest User!").withSession(
  "email" -> "unregisteredUserEmail"  //  assuming a randomly chosen Id since not logged yet
  // many other data here
)

Kemudian, Anda cukup menulis trait yang memperluas sifat SecureSocial Anda yang sebenarnya yang berisi:

case class GuestRequest[A](optUnregisteredUser: Option[UnregisteredUser], request: Request[A]) extends WrappedRequest(request)

def GuestAction(f: GuestRequest[AnyContent] => Result): Action[AnyContent] = {
    implicit request => {
      val optUnregisteredUserEmail = session.get("currentUnregisteredUser")
      val unregisteredUser = UnregisteredUser(optUnregisteredUserEmail) 
      f(GuestRequest(optUnregisteredUser, request))
}

Di setiap pengontrol terkait, Anda cukup melakukan:

def addToCard = GuestAction {
    implicit request =>
      val currentUnregisteredUser: UnregisteredUser = optUnregisteredUser.getOrElse(.....)
      //remaining instructions here
  }

--------------PEMBARUAN-------------

Memang, Anda bisa menggunakan UserAwareAction dari sifat SecureSocial yang ada untuk kedua gaya Pengguna. Jadi, Anda harus mengganti UserAwareAction pada sifat Anda yang memperluas SecureSocial, untuk menggabungkan fitur:

    override def UserAwareAction[A](p: BodyParser[A])(f: RequestWithUser[A] => Result) = Action(p) {
        implicit request => {
          val user = for (
            authenticator <- authenticatorFromRequest;
            user <- userServices.findByUserName(authenticator.userName)
          ) yield {
            touch(authenticator)
            user
          }
          if(user.isEmpty){  //meaning user is not logged
            f(RequestWithUser(tryToBuildUnRegisteredUser, request))  //setting your unregisteredUser
          }
          else{
            f(RequestWithUser(user, request))
          }
        }
      }

 private def tryToBuildUnregisteredUser = {
    val optUnregisteredUserEmail = session.get("currentUnregisteredUser")
    optUnregisteredUserEmail match {
      case Some(e) => Some(UnregisteredUser(e)) 
      case _ => None
    }
 }

Tentu saja, Anda bebas untuk melakukan refactor :)

person Mik378    schedule 13.05.2013
comment
Saya mencoba menerapkan solusi Anda saat kita berbicara, dan dengan cermat memperhatikan hasil edit Anda karena saya cukup baru di Play dan penjelasan tambahan sangat kami hargai - person Chris Beach; 13.05.2013
comment
Saya ingin memiliki hierarki objek pengguna yang memiliki superkelas abstrak yang berisi bidang seperti email, dan subkelas untuk UnregisteredUser dan RegisteredUser (yang berisi id DB misalnya). Saya ingin metode pengontrol saya mengharapkan subkelas Pengguna, memungkinkan saya untuk beroperasi secara setara dengan pengguna terdaftar dan tidak terdaftar. Saat ini saya menggunakan bungkus UserAwareAction yang disediakan oleh SecureSocial. Apakah ada cara untuk mengikat GuestAction Anda dengan ini, jadi dalam metode pengontrol saya, saya mendapatkan subkelas Pengguna terlepas dari apakah itu berasal dari objek sesi SecureSocial atau GuestAction? - person Chris Beach; 13.05.2013