面试题答案
一键面试实现思路
- 定义角色与权限映射:创建一个数据结构,用于存储不同角色及其对应的GraphQL操作权限。例如,使用枚举来定义角色,使用集合来存储每个角色允许的操作。
- 获取当前用户角色:在处理GraphQL请求时,需要一种机制来获取当前用户的角色信息。这可能涉及到从请求头、令牌(如JWT)或其他身份验证机制中提取角色信息。
- 权限验证:在执行GraphQL查询或变更操作之前,根据当前用户角色验证其是否有权限执行该操作。
关键代码片段
- 定义角色与权限
enum class Role {
ADMIN, USER, GUEST
}
val rolePermissions = mapOf(
Role.ADMIN to setOf("*"), // 管理员可以执行所有操作
Role.USER to setOf("query1", "mutation1"),
Role.GUEST to setOf("query1")
)
- 获取当前用户角色(假设从JWT中获取)
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.auth.*
import io.ktor.server.auth.jwt.*
fun ApplicationCall.getRoleFromJwt(): Role? {
val principal = this.principal<JWTPrincipal>()
return principal?.getClaim("role", String::class)?.let { roleStr ->
Role.valueOf(roleStr)
}
}
- 权限验证(在GraphQL解析器中)
import graphql.kotlin.execution.GraphQLContext
import graphql.schema.DataFetcher
class MyDataFetcher : DataFetcher<Any> {
override fun get(context: GraphQLContext): Any {
val call = context.get<KtorApplicationCall>("ktorCall")
val role = call.getRoleFromJwt()
val operationName = context.get<String>("operationName")
rolePermissions[role]?.let { permissions ->
if (permissions.contains("*") || permissions.contains(operationName)) {
// 有权限执行操作,返回数据
return "Some data"
}
}
throw GraphQLException("You do not have permission to perform this operation")
}
}
以上代码假设使用Ktor框架进行Web服务,在实际应用中,获取用户角色和上下文的方式可能因使用的Web框架而异。同时,GraphQL相关的依赖库和具体实现细节也可能需要根据项目实际情况调整。