面试题答案
一键面试区别与联系
- 区别
- 中间件:主要用于对请求和响应进行处理,是一种更底层、更通用的机制。它可以在请求到达路由之前或响应返回之前执行一些操作,比如日志记录、通用的请求处理等。中间件通常是轻量级的,专注于单一功能或一组相关功能,对整个应用的请求处理流程进行拦截和修改。
- 插件:插件相对更高级和功能更丰富。它可以包含多个中间件,还能提供额外的功能,如集成特定的第三方服务(如数据库连接池集成)、提供特定领域的功能(如OpenAPI文档生成)等。插件通常是为了解决特定的业务或技术问题而设计,对应用的功能进行扩展。
- 联系:插件可以利用中间件来实现其功能。插件的功能实现过程中可能会包含多个中间件来处理不同方面的请求和响应,而中间件是插件实现复杂功能的基础组件之一。
设计思路
- 定义权限验证逻辑:针对不同类型的请求(GET、POST等)和不同资源定义不同的权限级别。例如,GET请求可能只需要基本权限查看资源,而POST请求可能需要更高权限进行资源创建。
- 创建中间件:创建一个中间件,在其中根据请求类型(GET、POST等)和请求路径来判断需要的权限级别。然后,验证当前用户是否具备相应权限。
- 集成到Ktor应用:将该中间件集成到Ktor应用的请求处理流程中,确保在请求到达具体路由之前进行权限验证。
关键代码片段
import io.ktor.application.*
import io.ktor.http.*
import io.ktor.request.*
import io.ktor.response.*
import io.ktor.routing.*
import io.ktor.util.pipeline.*
// 模拟用户权限数据
data class User(val username: String, val permissions: Set<String>)
// 模拟当前用户获取逻辑
fun getCurrentUser(call: ApplicationCall): User? {
// 这里可以根据实际的认证逻辑,如从JWT中获取用户信息
return User("testUser", setOf("basic", "create"))
}
// 权限验证中间件
fun ApplicationCallPipeline.interceptRequestForPermissions() {
intercept(ApplicationCallPipeline.Features) {
val user = getCurrentUser(call)
if (user == null) {
call.respond(HttpStatusCode.Unauthorized, "User not authenticated")
return@intercept
}
val requestMethod = call.request.httpMethod
val requestPath = call.request.path()
// 根据请求方法和路径判断所需权限
val requiredPermissions = when (requestMethod) {
HttpMethod.Get -> if (requestPath.startsWith("/admin")) setOf("admin", "basic") else setOf("basic")
HttpMethod.Post -> setOf("create")
else -> emptySet()
}
if (!requiredPermissions.all { user.permissions.contains(it) }) {
call.respond(HttpStatusCode.Forbidden, "User does not have sufficient permissions")
return@intercept
}
}
}
fun main() {
embeddedServer(Netty, port = 8080) {
routing {
interceptRequestForPermissions()
get("/") {
call.respondText("Welcome!")
}
post("/create") {
call.respondText("Resource created")
}
get("/admin") {
call.respondText("Admin area")
}
}
}.start(wait = true)
}
上述代码首先定义了一个用于模拟用户权限的User
类和获取当前用户的方法getCurrentUser
。然后创建了一个interceptRequestForPermissions
中间件,在其中根据请求方法和路径判断所需权限,并与当前用户的权限进行对比。如果权限不足,返回相应的错误响应。最后,在Ktor应用的routing
中集成了该中间件。