0

Scala & Play 2.0 を使用しています

私はそのようなURLを持っています:

/v1/人/検索/MTIyOjg3YjYzNmU1YTk5MDdkYjY2MzAyODZiM2RkNTMzYzYw

私のルートファイルでは:

POST /v1/people/search/:authToken controllers.v1.Application.searchPeople(authToken: String)

私がやろうとしているのは、安全な特性を作成し、:aythToken を取得して、関数/メソッド呼び出しでそれを置き換えるカスタム アクションを介して検証することです。

アクションを CustomAuthAction にする

def searchPeople(authToken: String) = アクション {暗黙のリクエスト => }

この値を Cookie として設定せずに、既に解析された :authToken に基づいてリクエストを拒否できるように、私はすでにその方法を知っています。

では、すでに渡された play :authToken をカスタムアクションに渡すにはどうすればよいでしょうか?

ありがとう


これが私の解決策です:

case class CheckSessionRequest(val user: User, request: Request[AnyContent]) extends   WrappedRequest(request)

def RequireAuthToken(f: CheckSessionRequest => Result): Action[AnyContent] = {
Action { request =>
UserValidation.findUserByAuthToken(StringUtil.getAuthTokenFromURL(request.toString)).map     { user =>
f(CheckSessionRequest(user, request))
}.getOrElse( // STRANGE ERROR
Ok(Json.generate(StatusHandler("failed","Unknown Login Error","{}"))).withHeaders(
CONTENT_TYPE -> "application/json"
) 
)
}
}
4

2 に答える 2

2

Play のドキュメントを引用させてください。

Play アプリケーションが受け取るリクエストのほとんどは、アクションによって処理されます。

play.api.mvc.Action は基本的に、リクエストを処理し、クライアントに送信する結果を生成する (play.api.mvc.Request => play.api.mvc.Result) 関数です。

アクション構成を見ると、基本的に CustomAction を作成する方法が明確に説明されています。

def LoggingAction(f: Request[AnyContent] => Result): Action[AnyContent] = {
  Action { request =>
    Logger.info("Calling action")
    f(request)
  }
}

私は同様の作業を行いましたが、それは見た目が少し複雑ですが興味深いものです

trait SecuredController[UserModel<:ValidableEmail] {

  type LoggedRequestHandler  =  UserModel =>Request[AnyContent] => Result

  def loggedUser(implicit request:Request[_]):Option[UserModel]

  def WithAuthenticatedUser( onUserAuthenticated: => LoggedRequestHandler,
                             onUserAuthenticatedButEmailNotValidated: LoggedRequestHandler,
                             onUnauthenticated: Request[AnyContent]=>Result) = {
    Action{
     implicit request =>
        loggedUser match{
          case Some(user) if (user.emailValidated) => onUserAuthenticated(user)(request)
          case Some(user) if(!user.emailValidated) => onUserAuthenticatedButEmailNotValidated(user)(request)
          case None => onUserNotLogged(request)
        }
    }
  }

このトレイトは、基本的に 2 つのメソッドを定義します。

  • リクエストから現在ログインしているユーザーがいるかどうかを判断できるもの (通常はセッションを使用)
  • 基本的に3つの可能な結果を​​持つアクションを作成するもの:
    • メールが検証されたログインユーザーがいる場合の onUserAuthenticated
    • onUserAuthenticatedButEmailNotValidated はログに記録されているが電子メールが検証されていない場合
    • onUserNotLoggedif ログに記録されているが、電子メールが検証されていない場合

LoggedRequestHandler は、ユーザー UserModel を取得して関数 Request => Result を作成する関数の単なるタイプ エイリアスです。

これができたら、基本的に次のように書くことができます

object EmployeeController extends SecuredController[Employee]{

    def loggedUser(implicit request:Request[_]):Option[Employee]

    def ViewPay = WithAuthenticatedUser{
       ShowPay, 
       ShowEmailNotValidated,
       ShowUserNotLogged        
    }

    def ShowPay(employee:Employee): Request[AnyContent] => Result = {

    }
    def ShowEmailNotValidated(employee:Employee): Request[AnyContent] => Result = {

    }

    def ShowUserNotLogged: Request[AnyContent] => Result = {

    }



}
于 2012-12-13T09:31:41.083 に答える
1

これが私が思いついた解決策で、完全に機能します。

case class CheckSessionRequest(val user: User, request: Request[AnyContent]) extends   WrappedRequest(request)

def RequireAuthToken(f: CheckSessionRequest => Result): Action[AnyContent] = {
    Action { request =>
     UserValidation.findUserByAuthToken(StringUtil.getAuthTokenFromURL(request.toString)).map     { user =>
      f(CheckSessionRequest(user, request))
     }.getOrElse( // STRANGE ERROR
      Ok(Json.generate(StatusHandler("failed","Unknown Login Error","{}"))).withHeaders(
       CONTENT_TYPE -> "application/json"
      ) 
    )
  }
}

次に、「アクション」呼び出しを RequireAuthToken に置き換えます

于 2012-12-14T23:20:00.880 に答える