如何在 ktor 框架中限制路由访问?

Posted

技术标签:

【中文标题】如何在 ktor 框架中限制路由访问?【英文标题】:How to restrict route access in ktor framework? 【发布时间】:2022-01-10 06:10:17 【问题描述】:

ktor框架如何限制route访问?

//only admin           
post("/add") 
   call.respondText  "add" 


post("/delete") 
   call.respondText  "delete" 

        

【问题讨论】:

能否更详细地描述您的问题?你想实现什么类型的中间件?另外,你提到的 API 还没有发布。 @AlekseiTirman laravel.com/docs/8.x/middleware 我想通过插件限制路由访问。 在Ktor中你可以拦截管道来达到类似的效果。有关路由拦截的信息,请阅读文档ktor.io/docs/…。 @AlekseiTirman 请给我一个例子。例如,我们有三个 post 方法,我们想限制它们。 //仅管理员 post("add") post("delete") //仅客户 post("show") 【参考方案1】:

您可以编写一个方法来创建仅限制管理员访问的路由。在该方法内部,新创建的路由被拦截以注入代码进行验证。在以下示例中,如果标头 admin 具有值 1,则从管理员发出请求,否则 /add/delete 路由将返回具有 401 Unauthorized 状态的响应。

import io.ktor.application.*
import io.ktor.auth.*
import io.ktor.http.*
import io.ktor.request.*
import io.ktor.response.*
import io.ktor.routing.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
import io.ktor.util.pipeline.*

fun main() 
    embeddedServer(Netty, port = 5555, host = "0.0.0.0") 
        routing 
            admin 
                post("/add") 
                    call.respondText  "add" 
                

                post("/delete") 
                    call.respondText  "delete" 
                
            

            post("/show") 
                call.respondText  "show" 
            
        
    .start(wait = false)


private val validationPhase = PipelinePhase("Validate")

fun Route.admin(build: Route.() -> Unit): Route 
    val route = createChild(AdminSelector())

    route.insertPhaseAfter(ApplicationCallPipeline.Features, Authentication.ChallengePhase)
    route.insertPhaseAfter(Authentication.ChallengePhase, validationPhase)
    route.intercept(validationPhase) 
        if (!isAdmin(call.request)) 
            call.respond(HttpStatusCode.Forbidden)
            finish()
        
    
    route.build()
    return route


class AdminSelector: RouteSelector() 
    override fun evaluate(context: RoutingResolveContext, segmentIndex: Int) = RouteSelectorEvaluation.Transparent


fun isAdmin(request: ApplicationRequest): Boolean 
    return request.headers["admin"] == "1"

【讨论】:

非常感谢。您是否查看过 Ktor 的第 2 版?创建自定义插件变得更加容易。是否可以使用插件实现此代码? ktor.io/docs/eap/custom-plugins.html 是的,但需要编写一个钩子。此外,您的问题可以通过身份验证插件ktor.io/docs/auth.html 解决。 在使用自定义插件 2.0.0-beta-1 时无法正常工作。甚至非管理员仍然被检查 @ronscript 此示例适用于 Ktor 1.6.7。

以上是关于如何在 ktor 框架中限制路由访问?的主要内容,如果未能解决你的问题,请参考以下文章

在 Ktor 中访问请求中的路由路径字符串

如何在 Kotlin 的 Ktor 中提取访问权限验证

如何在 Ktor 中构建嵌套路由?

Oauth2 授权路由在 Ktor 中不起作用

如何在 Ktor 内部重定向?

如何在 Ktor (Kotlin) 中管道的各个部分之间传递数据