0

我正在使用 authenticate 指令在 spray.io 1.3.2 中尝试对 post 请求进行基本身份验证。我的代码如下所示:

  val route: Route = {
    pathPrefix("ato") {
      pathPrefix("v1") {
        path("orders" / "updateStatus") {
          post {
            authenticate(BasicAuth(userPasswordAuthenticator _, realm = "bd ato import api")) {
              user =>
                entity(as[String]) {e =>
                  complete {
                    s"Hello $e "
                  }
                }
            }
          }

        }
      }
    }
  }

  def userPasswordAuthenticator(userPass: Option[UserPass]): Future[Option[String]] =
    Future {
      if (userPass.exists(up => up.user == ato_import_v1_usr && up.pass == ato_import_v1_pwd)) Some("ato_v1")
      else None
    }

这工作得很好,授权状态正常 200,未授权 401。但是,当指令的顺序更改如下:

  val route: Route = {
    pathPrefix("ato") {
      pathPrefix("v1") {
        authenticate(BasicAuth(userPasswordAuthenticator _, realm = "bd ato import api")) {
          user =>
        path("orders" / "updateStatus") {
          post {
                entity(as[String]) {e =>
                  complete {
                    s"Hello $e "

                  }
                }
            }
          }

        }
      }
    }
  }

我收到状态 405,HTTP 方法不允许未经授权的访问。我不确定为什么会这样。从某种意义上说,由于缺少凭据等,路径不匹配。

有人可以澄清一下吗?

我想把授权放在 v1 级别的原因是我想让每个版本都用不同的密码保护。有没有办法实现这一目标?链接指令的最佳实践是什么?

我想遵循 DRY 原则。

谢谢

4

0 回答 0