温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Scala Lift: uniform authentication with form based login and HTTP basic auth?
lift scala

其他 - Scala Lift:使用基于表单的登录名和HTTP基本身份验证进行统一身份验证?

发布于 2021-04-10 05:36:58

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

目前,我确实设置了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始终不返回任何用户。我在某处读到这是由于在请求生命周期的此阶段尚未初始化用户会话这一事实。

在Lift中,有什么方法可以独立使用哪种身份验证方法来保护资源?原则上,我不在乎用户如何进行身份验证(表单身份验证,基本身份验证,摘要身份验证)。而且,如果他确实使用基于表单的登录进行身份验证,那么当他尝试访问REST API资源时,我不想以基本身份验证来挑战他(例如,在对REST API进行AJAX调用时,Web应用程序html表单将执行此操作)。

查看更多

提问者
gruenewa
被浏览
0
rfreytag 2014-03-25 21:36

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

在我看来,执行你的案件的一种方法是:

  1. 在使用basic-auth的无状态范围中创建RESTful API
  2. 在有状态作用域中创建第二个API,以检查会话身份验证。

进行身份验证后,可以适当地使用重写规则将一个映射到另一个。