2012-02-19 134 views
3

我用RestHelper電梯(斯卡拉Webframework)提供了web應用以及web服務。用戶可以使用Web應用程序的HTML表單,也可以使用REST API替代地編寫自己的服務客戶端。 html表單將主要通過JQuery使用帶有AJAX的REST API來實現,以避免重複的功能。我想用HTTP Basic Auth(或類似的東西)來保護REST API。我還希望看到使用電梯默認登錄表單登錄到Web應用程序的用戶無需執行額外的基本身份驗證(因爲他們已經在基於表單的登錄期間創建了會話)。我如何使用Lift來實現這一點?Scala Lift:基於表單的登錄和HTTP基本身份驗證的統一身份驗證?

目前,我設置HTTP基本驗證:

// Use Basic Authentication 
LiftRules.authentication = HttpBasicAuthentication("lift") { 
    case (email, password, req) => { 
User.find(By(User.email, email)) match { 
     case Full(user) if user.password.match_?(password) => { 
    userRoles(List(AuthRole("user"), AuthRole(user.id.toString))) 
    User.logUserIn(user) 
     true 
     } 
     case _ => false 
} 
    } 
} 

,並確定我的保護REST API資源如下:

// Protect REST API resources with Basic Auth (but only if user has no Session) 
LiftRules.httpAuthProtectedResource.prepend{ 
    case Req("api" :: "users" :: userId :: _, _, _) => 
User.currentUser match { 
    // if the user has already signed in per form we grant access 
    case Full(user) => Empty 
    case _ => Full(AuthRole(userId)) 
} 
} 

不幸的是,這並不工作和User.currentUser始終沒有返回用戶。我在某處讀過,這是由於用戶會話在請求生命週期的這個階段尚未初始化。

是否有電梯任何方式只是保護資源indenpendtly其身份驗證方法的使用?原則上我不在乎用戶如何進行身份驗證(表單身份驗證,基本身份驗證,摘要身份驗證)。如果他使用基於表單的登錄進行身份驗證,當他嘗試訪問REST API資源時(例如,Web應用程序的HTML表單在對REST API進行AJAX調用時會這樣做),我不想用基本身份驗證來挑戰他。

+0

有一個在使用基本身份驗證是否會有jQuery的要求,這將必須包括這樣的密碼是沒有意義的。人們將只能讀取該密碼並進入您的網站 – fmpwizard 2012-02-19 14:01:55

+0

正確。這就是爲什麼我想使用基本身份驗證的外部Web服務客戶端和Auhtorization通過使用用戶會話的表單登錄瀏覽Web應用程序的用戶。所以通過JQuery的AJAX調用不需要使用基本身份驗證。他們應該已經通過會話授權。 – gruenewa 2012-02-29 17:20:06

回答

1

LiftRules.httpAuthProtectedResource執行的代碼在無狀態範圍被執行。因此,您無法訪問之前生成的任何SessionVars。

在我的眼裏實現你的情況的一種方法是:

  1. 在使用基本認證
  2. 在檢查會話級的狀態範圍內創建第二個API的無國籍範圍創建一個RESTful API認證。

在進行身份驗證後,您可以使用rewrite-rules將一個映射到另一個。