1

我试图弄清楚如何编写一个为某些 URL 启用基本身份验证的应用程序。经过身份验证的部分不应具有基于表单的身份验证,只是我可以从 Javascript/JQuery 轻松完成的默认登录。我见过一些看起来很复杂的 例子,当我尝试使用它们时,很多东西都被弃用了,一般来说,即使现在编译也需要做很多工作。

那么这些示例仍然是 Scalatra 必须提供的最好的,还是现在有更简单的方法?

我正在使用 Scalatra(带有 scalatra-auth)版本 2.1.1。

4

2 回答 2

3

找到了一个更简单的示例并使以下代码正常工作。

package mc.nulty

import org.scalatra.auth.strategy.BasicAuthStrategy.BasicAuthRequest
import org.scalatra._
import scalate.ScalateSupport

class McNultyServlet extends ScalatraServlet with ScalateSupport {

  get("/") {
    basicAuth
    <html>
      <body>
        <h1>Hello, world!</h1>
        Say <a href="hello-scalate">hello to Scalate</a>.
      </body>
    </html>
  }

  notFound {
    // remove content type in case it was set through an action
    contentType = null
    // Try to render a ScalateTemplate if no route matched
    findTemplate(requestPath) map { path =>
      contentType = "text/html"
      layoutTemplate(path)
    } orElse serveStaticResource() getOrElse resourceNotFound()
  }

  protected def basicAuth() = {
    val req = new BasicAuthRequest(request)

    def notAuthenticated() {
      response.setHeader("WWW-Authenticate", "Basic realm=\"%s\"" format "mc-nulty")
      halt(401, "Unauthenticated")
    }

    if(!req.providesAuth) {
      notAuthenticated
    }
    if(!req.isBasicAuth) {
      halt(400, "Bad Request")
    }
    val user = DAO.validateLoginPassword(req.username, req.password)
    if (user != null)
      response.setHeader("REMOTE_USER", "user.id")
    else {
      notAuthenticated
    }
    Option(user)
  }

  object DAO {
    def validateLoginPassword(username: String, password: String) : User = {
      if (username.equals("foo")) new User()
      else null
    }
  }
  class User(val id:String = "dummyid") {}
}
于 2013-01-13T12:46:05.150 回答
1

现在有一个关于身份验证的 Scalatra 指南,它涵盖了您正在寻找的基本身份验证案例。见http://scalatra.org/2.2/guides/http/authentication.html

Scalatra 的身份验证集成不应在 Scalatra 2.1.1(您正在使用)和即将发布的 Scalatra 2.2.0 之间发生变化,因此该指南对您应该仍然有效。

于 2013-02-03T14:55:46.503 回答