1

Play Framework (Scala) と SecureSocial を使用してユーザーを認証しています。

ログインしていないユーザーが、セッション中に特定のユーザー データ (電子メール アドレスなど) を閲覧および入力できるようにサイトを設定したいと考えています。

ログインしたユーザーを DB に保持するカスタム UserService 実装があります (およびUsersecuresocial.core.Identity Trait を実装する独自のモデル オブジェクト)。

UnregisteredUserユーザーがログインしていない間、セッションに保持したいサブクラスがあります。

これのベストプラクティスは何ですか?

4

1 に答える 1

1

あなたの特定の目標は、関心のあるコントローラーの各アクションで、未登録のユーザーに関連するデータ全体を効率的に収集することだと思います。UnregisteredUser問題:セッションでこれらすべてのデータを直接収集するビルドを取得したいと考えています。

UnregisteredUserまず、基本的な Play 2 の API Sessionsを使用して、セッションでいつでもデータを永続化します。

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

次に、以下を含むtrait実際のSecureSocialトレイトを拡張するだけで記述できます。

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))
}

関連する各コントローラーで、次のことを行うだけです。

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

- - - - - - - アップデート - - - - - - -

UserAwareAction実際、両方の User スタイルにfrom existing SecureSocialtrait を使用できます。したがって、UserAwareAction機能を組み合わせるには、SecureSocial を拡張するトレイトでオーバーライドする必要があります。

    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
    }
 }

もちろん、自由にリファクタリングできます:)

于 2013-05-13T11:23:45.607 に答える