Директива аэрозольной аутентификации возвращает разные коды состояния HTTP
Я пытаюсь выполнить базовую аутентификацию по запросу после публикации в spray.io 1.3.2 с использованием директивы authenticate. Мой код выглядит следующим образом:
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
}
Это работает отлично, авторизованный Status Ok 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, заключается в том, что я хотел сделать каждую версию защищенной разным паролем. Есть ли способ, как этого добиться? Какова лучшая практика в цепочечных директивах?
Я хотел бы следовать принципу СУХОЙ.
Спасибо