Получить currentUser внутри Lift RestHelper - PullRequest
3 голосов
/ 30 июня 2011

Может ли кто-нибудь помочь мне вернуть аутентифицированного пользователя, который инициировал вызов REST?Я использую Lift с RestHelper

В моем Boot.scala у меня есть следующее:

LiftRules.httpAuthProtectedResource.prepend {
  case Req(List("api", "incomingCall", incomingCall), _, GetRequest) => Full(AuthRole("admin"))
}

LiftRules.authentication = HttpBasicAuthentication("lift") {
  case (username, password, req) => {
    User.find(By(User.firstName, username)) match {
      case Full(user) if user.password.match_?(password) => {
        userRoles(AuthRole("admin"))
        User.logUserIn(user) //I tried with and without this line
         true
      }
      case x => {
        false
      }
    }
  }
}

LiftRules.dispatch.append(IncomingCallRest)

И мой файл IncomingCallRest.scala выглядит так:1009 *User.currentUser не возвращает аутентифицированного пользователя.

Как видите, мой код основан на примере ChatServer .Я делаю тот же звонок на User.currentUser из ChatIn.scala, и там он работает.

Есть предложения?

1 Ответ

3 голосов
/ 30 июня 2011

Создатель Lift предложил следующее в старом потоке :

Сессии не инициализируются так рано в цикле запросов / ответов HTTP.Тем не менее, RequestVars есть.Мое предложение состоит в том, чтобы поместить User в RequestVar, а затем в вашем модуле API, прочитать RequestVar и поместить его в SessionVar.

Я изменил свой код следующим образом, чтобы реализовать его предложения:

//IncomingCallRest.scala
object userIdRequestVar extends RequestVar[String]("Default") //This RequestVar is set in Boot.scala
object IncomingCallRest extends RestHelper {
  serve {
    case "api" :: "incomingCall" :: incomingCall :: _ JsonGet _ => {
      val messageWithUser = (incomingCall, userIdRequestVar.is)
      ChatServer ! messageWithUser
      JString(incomingCall)
    }
  }
}

//Boot.scala
LiftRules.authentication = HttpBasicAuthentication("lift") {
  case (username, password, req) => {
    User.find(By(User.firstName, username)) match {
      case Full(user) if user.password.match_?(password) => {
        userRoles(AuthRole("admin"))
        userIdRequestVar.set(user.userIdAsString) //Set the RequestVar
        true
      }
      case x => {
        false
      }
    }
  }
}
...