0

私はこの方法を持っています:

def withAuth(f: => User => Request[AnyContent] => Result) = {
    Authentication.isAuthenticated(AuthenticationToken(AuthenticationService.TokenKey)) match {
      case None => Results.Redirect(routes.AuthenticationService.notLoggedIn)
      case Some(user) => Action(request => f(user)(request))
    }
  }

そして私はそれを次のように使用します:

  def list(locationId: Option[Int]) = withAuth { user =>
    implicit request =>
      val entities = Assets.filter(user, locationId)
      Logger.info("Succesfully returned %d assets to user %s".format(entities.length, user))
      Ok(Json.toJson(entities.map(s => Json.toJson(s))))
  }

Redirectお気づきのように、ユーザーがログインしていない場合はログインページに移動し、それ以外の場合はセッションからユーザーを返すメソッドのように使用したいと考えています。問題はそのリダイレクトにあり、実行時に Play は次のように不平を言っています:

Object を返すメソッドを Handler として使用することはできません

誰にも手がかりはありますか?

4

2 に答える 2

1

上記の問題を回避するために、最終的には次のようにしました。

   def onUnauthorized(request: RequestHeader) = Results.Redirect(routes.AuthenticationService.notLoggedIn)

  /**
   * A very important wrapper method which checks if the user is logged-in: if it is, return the User, otherwise
   * redirect the user to a specific page.
   */
  def withAuthentication(f: => Option[User] => Request[AnyContent] => Result) = {
    Security.Authenticated(userId, onUnauthorized) { user =>
      Action(request => f(Users.findById(Integer.valueOf(user)))(request))
    }
  }
于 2012-12-06T09:22:19.130 に答える
0

withAuth の戻り値の型は、あなたが思っているものではないと思います。リダイレクトをアクションでラップする必要があると思います。

于 2012-12-06T01:54:12.163 に答える