Ktor 在基本身份验证块内的路由拦截器中提示输入凭据
Ktor prompt for credentials from within route interceptor inside a basic authentication block
当我设置基本身份验证提供程序并将一个简单的 get
处理程序放入 authenticate
块中时,当我尝试访问该路由时,系统会提示我输入凭据,因此一旦get 处理程序开始执行,我可以访问 UserIdPrincipal
并开始查找与该帐户关联的数据。但是,我现在想扩展我的 authenticate
块以包含多个路由,所以我认为我可以处理 intercept
块内的 principal/account 的初始处理。然而,当我尝试这样做时,系统不会提示我输入凭据,因此拦截器中的 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 {
...
}
}
}
将拦截器阶段设置为 ApplicationCallPipeline.Call
解决了这个问题,现在提示我输入凭据。感谢@f-caron 的想法。
当我设置基本身份验证提供程序并将一个简单的 get
处理程序放入 authenticate
块中时,当我尝试访问该路由时,系统会提示我输入凭据,因此一旦get 处理程序开始执行,我可以访问 UserIdPrincipal
并开始查找与该帐户关联的数据。但是,我现在想扩展我的 authenticate
块以包含多个路由,所以我认为我可以处理 intercept
块内的 principal/account 的初始处理。然而,当我尝试这样做时,系统不会提示我输入凭据,因此拦截器中的 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 {
...
}
}
}
将拦截器阶段设置为 ApplicationCallPipeline.Call
解决了这个问题,现在提示我输入凭据。感谢@f-caron 的想法。