Scala Lift:基于表单登录和HTTP基本身份验证的统一身份验证?

时间:2012-02-19 09:55:46

标签: scala lift

我使用Lift(Scala Webframework)和RestHelper来提供Web应用程序和Web服务。用户可以使用Web应用程序的HTML表单,也可以使用REST API替代编写自己的服务客户端。 html表单将主要使用带有AJAX的REST API与JQuery一起实现,以避免重复的功能。我想使用HTTP Basic Auth(或类似的东西)来保护REST API。我还想看到使用升降机默认登录表单登录Web应用程序的用户不需要执行其他基本身份验证(因为他们已经在基于表单的登录期间创建了会话)。如何使用Lift实现这一目标?

目前,我确实设置了HTTP Basic Auth:

// 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总是不返回任何用户。我在某处读过这是因为用户会话在请求生命周期的这个阶段尚未初始化。

Lift中是否有任何方法可以仅使用哪种身份验证方法来保护资源?原则上我并不关心用户如何进行身份验证(表单身份验证,基本身份验证,摘要身份验证)。如果他使用基于表单的登录进行身份验证,我不想在尝试访问REST API资源时使用基本身份验证来挑战他(例如,在对REST API进行AJAX调用时,Web应用程序html表单会执行此操作)。

1 个答案:

答案 0 :(得分:1)

LiftRules.httpAuthProtectedResource中执行的代码在无状态范围内执行。因此,您无权访问之前生成的任何SessionVars。

在我眼中实施案例的一种方法是:

  1. 在使用basic-auth
  2. 的无状态范围内创建RESTful API
  3. 在有状态范围内创建第二个API,用于检查会话身份验证。
  4. 在进行身份验证后,您可以使用重写规则将一个映射到另一个。

相关问题