我将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表单将执行此操作)。
在其中执行的代码在LiftRules.httpAuthProtectedResource
无状态范围内执行。因此,你无权访问之前生成的任何SessionVar。
在我看来,执行你的案件的一种方法是:
进行身份验证后,可以适当地使用重写规则将一个映射到另一个。