Ktor提示从基本身份验证块内的路由拦截器中输入凭据

时间:2019-09-11 03:52:13

标签: kotlin basic-authentication ktor

当我设置基本身份验证提供程序并将简单的get处理程序放在authenticate块中时,尝试访问路由时会提示我输入凭据,因此一旦获取处理程序开始执行后,我可以访问UserIdPrincipal并开始查找与该帐户关联的数据。但是,我现在想扩展我的authenticate块以包括多个路由,因此我认为我可以处理intercept块中的委托人/帐户的初始处理。但是,当我尝试执行此操作时,不会提示我提供凭据,因此拦截器中的UserIdPrincipal为空。如何让Ktor从authenticate块内的路由拦截器中提示我输入我的凭据?

当我尝试访问仪表板路线时,此代码会正确提示我输入凭据。

authenticate("teacherAuth") {
    get("dashboard") {
        val principal = call.principal<UserIdPrincipal>()!!
        val schoolName = principal.name
        val school = transaction {
            School.find { Schools.name eq schoolName }.singleOrNull()
        }
        if (school == null)
            call.respondText("No school \"$schoolName\" found")
        else
            call.respondHtml {
                ...
            }
    }
}

当我尝试访问仪表板路线时,此代码不会提示我输入凭据,从而导致错误。

authenticate("teacherAuth") {
    val schoolKey = AttributeKey<School>("school")

    intercept(ApplicationCallPipeline.Setup) {
        val principal = call.principal<UserIdPrincipal>()!!
        val schoolName = principal.name
        val school = transaction {
            School.find { Schools.name eq schoolName }.singleOrNull()
        }
        if (school == null) {
            call.respondText("No school \"$schoolName\" found")
            return@intercept finish()
        }
        call.attributes.put(schoolKey, school)
    }

    get("dashboard") {
        val school = call.attributes[schoolKey]
        call.respondHtml {
            ...
        }
    }
}

1 个答案:

答案 0 :(得分:1)

将拦截器阶段设置为ApplicationCallPipeline.Call可以解决此问题,现在提示我输入我的凭据。归功于@ f-caron。