我有一个基于Ktor的REST API应用程序,该应用程序使用mRemoteMediaClient.getMediaStatus().getStreamPosition()
令牌作为身份验证。然后,我必须限制特定角色的某些路线。为此,我正在创建主体,其中包含相关信息:
mRemoteMediaClient.getApproximateStreamPosition()
签署正确登录的用户时,将提供带有jwt
和data class UserPrincipal (
val id: Long,
val username: String,
val roleId: Long,
): Princpal {
override fun getName() = username
}
object AuthLogin {
fun Application.auth(jwt: JwtProvider) {
install(Authentication) {
jwt("jwt") {
realm = jwt.realm()
verifier(jwt.verifier())
validate {
val userId = it.payload.getClaim("id").asLong()
val username = it.payload.getClain("name")
val roleId = it.payload.getClaim("roleId").asLong()
UserPrincipal(userId, username, roleId)
}
}
}
}
}
的声明。现在,我可以像这样限制REST端点:
userId
如您所见,即使在一个路由功能中,我也必须重复两次检查主体角色的代码。我可以将其移出功能,但是我想要的只是一个位置来定义我的安全角色。像这样:
roleId
然后将其插入其余端点。还是我可以在Kotlin的Ktor中使用类似的方法?似乎是拦截器是我所需要的,但我不确定如何以预定的方式使用它们。
答案 0 :(得分:0)
您可以在validate
块中检查方法和uri。
install(Authentication) {
jwt {
validate {
val userId = it.payload.getClaim("id").asLong()
val username = it.payload.getClaim("name").asString()
val roleId = it.payload.getClaim("roleId").asLong()
UserPrincipal(userId, username, roleId)
val requiredRole = when (request.httpMethod) {
HttpMethod.Get -> // get role
HttpMethod.Post -> // get other role
}
// check if role exists in repo
}
}
}
install(Routing) {
get {
val principal = call.principal<UserPrincipal>()!!
call.respond(principal)
}
post {
val principal = call.principal<UserPrincipal>()!!
call.respond(principal)
}
}
顺便说一句,您发布的代码存在多个问题,因此无法编译。