我正在使用 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 原则。
谢谢