【问题标题】:Set up Ktor authenticated shutdown route设置 Ktor 认证关闭路由
【发布时间】:2021-10-25 21:15:58
【问题描述】:

我想向我的 Ktor 服务器添加关闭路由,但我需要它来要求身份验证。

我正在尝试将关闭 url 放在经过身份验证的路由中,如下所示:

// application.conf
ktor {
    deployment {
        port = 8080
        host = 127.0.0.1
        shutdown.url = "/shutdown"
    }
}
// Application.kt
routing {
    root()
    
    authenticate("authenticated-routes") {
        test1()
        test2()
        shutdown()
    }
}

// Routes.kt
fun Route.shutdown() {
    get("/shutdown") {
        // shutting down
    }
}

但不知何故,关闭路由不需要身份验证来关闭服务器(与覆盖Routes.kt中定义的路由的配置有关?)

不幸的是,文档没有给出任何关于如何使关闭路由经过身份验证的提示。关于如何确保不只是任何人都可以调用关闭路由并关闭我的服务器的任何想法?

【问题讨论】:

  • 你如何定义"authenticated-routes"?它应该在install(Authentication) 里面
  • 绝对是的。我试图让这个例子中的代码保持最小,但我的install(Authentication) 块在那里并且定义明确。您认为我应该编辑问题以添加完整吗?

标签: kotlin ktor


【解决方案1】:

ShutDownUrl 插件与Routing 没有任何关系,这就是为什么你不能将它与Authentication 插件集成的原因。要解决您的问题,您可以手动创建 ShutDownUrl 类的实例并在可能需要身份验证的路由中执行 doShutdown 方法。这是一个例子:

import io.ktor.application.*
import io.ktor.auth.*
import io.ktor.response.*
import io.ktor.routing.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*

fun main() {
    val shutdown = ShutDownUrl("") { 1 }

    embeddedServer(Netty, port = 3333) {
        install(Authentication) {
            basic {
                realm = "Access for shutting the server down"
                validate { credentials ->
                    if (credentials.name == "jetbrains" && credentials.password == "foobar") {
                        UserIdPrincipal(credentials.name)
                    } else {
                        null
                    }
                }
            }
        }

        routing {
            get("/") {
                call.respondText { "hello" }
            }

            authenticate {
                get("/shutdown") {
                    shutdown.doShutdown(call)
                }
            }
        }
    }.start()
}

【讨论】:

  • 这行得通!非常感谢。但我不清楚ShutDownUrl("") 中的空字符串和get("/shutdown") 中的正确url 是如何交互的。
  • ShutDownUrl 构造函数中的 URI 仅在您安装 ShutDownUrl 插件时使用。此插件拦截ApplicationCallPipeline 并在请求的 URI 与提供的匹配时关闭服务器。在我的示例中,我没有安装插件,而是在路由中手动调用doShutdown 方法。换句话说,我使用路由来确定何时关闭服务器,而不是依赖默认的插件行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 2010-09-06
  • 1970-01-01
  • 2015-12-17
  • 2015-07-31
  • 2020-05-17
相关资源
最近更新 更多