首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ktor:模拟主体

Ktor:模拟主体
EN

Stack Overflow用户
提问于 2021-10-08 08:16:08
回答 1查看 43关注 0票数 0

我有以下路线:

代码语言:javascript
复制
   get("/user") {
        val principal: UserIdPrincipal = call.principal()
            ?: return@get call.respond(HttpStatusCode.Unauthorized)
        val user = userService.findUserForId(principal.name.toLong())
            ?: return@get call.respond(HttpStatusCode.Unauthorized)

        val userResponse = UserResponse(username = user.username)
        call.respond(userResponse)
    }

我不想测试身份验证是否适用于我的每一个路由,所以我想模拟call.principal()。因为它是一个内联扩展函数,所以不容易被模仿。有什么办法可以解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2021-10-11 15:19:50

如果您可以在测试中更改Authentication插件的配置,那么您就可以注册一个提供者,在AuthenticationPipeline.RequestAuthentication阶段拦截它的管道,以获得对身份验证上下文的访问,并最终分配新的主体。下面是一个示例:

代码语言:javascript
复制
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 server = embeddedServer(Netty, port = 8080) {
        install(Authentication) {
            provider {
                pipeline.intercept(AuthenticationPipeline.RequestAuthentication) { context ->
                    context.principal(UserIdPrincipal("principal"))
                }
            }
        }

        routing {
            authenticate {
                get("/user") {
                    val principal: UserIdPrincipal = call.principal()!!
                    call.respond(principal.name)
                }
            }
        }
    }

    server.start(wait = true)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69492619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档