部分应用程序的Scalatra基本身份验证

时间:2013-01-13 11:11:34

标签: http scala basic-authentication scalatra

我正在试图弄清楚如何编写一个为某些网址启用了基本身份验证的应用。经过身份验证的部分不应该具有基于表单的身份验证,只需要我可以从Javascript / JQuery轻松执行的默认登录。我看到一个few examples看起来很复杂,当我尝试使用它们时,许多东西都被弃用了,一般来说,将示例代码连接起来似乎要做很多工作。现在编译。

那些示例仍然是Scalatra最好的例子,或者现在有更简单的方法吗?

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

2 个答案:

答案 0 :(得分:3)

找到easier example并获得以下代码。

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") {}
}

答案 1 :(得分:1)

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

Scalatra的auth集成不应该在Scalatra 2.1.1(您正在使用)和即将发布的Scalatra 2.2.0之间进行更改,因此该指南仍然适用于您。