如何在Kotlin的Ktor中提取访问权限验证

时间:2019-05-24 22:10:52

标签: kotlin ktor

我有一个基于Ktor的REST API应用程序,该应用程序使用mRemoteMediaClient.getMediaStatus().getStreamPosition()令牌作为身份验证。然后,我必须限制特定角色的某些路线。为此,我正在创建主体,其中包含相关信息:

mRemoteMediaClient.getApproximateStreamPosition()

签署正确登录的用户时,将提供带有jwtdata 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中使用类似的方法?似乎是拦截器是我所需要的,但我不确定如何以预定的方式使用它们。

1 个答案:

答案 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)
    }
}

顺便说一句,您发布的代码存在多个问题,因此无法编译。