2011-06-30 3 views
3

REST呼び出しを開始した認証済みユーザーを検索するのに手伝ってください。私は、次のしている私のBoot.scalaLift RestHelperの中に最新のユーザーを取得

RestHelperでリフトを使用しています:

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ファイルは次のようになります。

object IncomingCallRest extends RestHelper { 
    serve { 
    case "api" :: "incomingCall" :: incomingCall :: _ JsonGet _ => { 
     val currentUser = User.currentUser openOr User; //<--- On this line I'm trying to access the User, but it returns a blank user 
     val messageWithUser = (incomingCall, currentUser.userIdAsString) 
     ChatServer ! messageWithUser 
     JString(incomingCall) 
    } 
    } 
} 

User.currentUserが認証戻りませんユーザー。

ご覧のとおり、コードはChatServer exampleに基づいています。私はChatIn.scalaからUser.currentUserへの同じ電話をしています。

提案がありますか?

答えて

3

リフトの生みの親old threadに次のように提案:

セッションは、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 
     } 
    } 
    } 
} 
関連する問題