当我设置基本身份验证提供程序并将简单的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 {
...
}
}
}
答案 0 :(得分:1)
将拦截器阶段设置为ApplicationCallPipeline.Call
可以解决此问题,现在提示我输入我的凭据。归功于@ f-caron。