You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过代码判断Ktor的开发模式是否处于激活状态?

判断Ktor开发模式状态并自动登录测试用户

1. 判断开发模式是否激活

Ktor 提供了直接的 API 来判断当前环境是否处于开发模式,你可以通过 application.environment.developmentMode 这个布尔属性获取状态——当用 runDevelopment 启动应用时该值为 true,生产环境启动时为 false。

示例代码(在 Ktor 模块中使用):

fun Application.module() {
    val isDevMode = environment.developmentMode
    
    if (isDevMode) {
        println("当前处于开发模式")
        // 开发模式专属逻辑
    }
}

2. 开发模式下强制登录测试用户

你可以通过请求拦截器,在开发模式下自动为未登录请求注入测试用户的身份信息。下面分两种常见认证方式给出实现:

方式一:会话认证

先确保已配置会话插件:

install(Sessions) {
    cookie<UserSession>("USER_SESSION") {
        cookie.extensions["SameSite"] = "lax"
    }
}

data class UserSession(val userId: String, val username: String)

添加拦截器自动设置测试用户会话:

fun Application.module() {
    val isDevMode = environment.developmentMode
    
    if (isDevMode) {
        intercept(ApplicationCallPipeline.Call) {
            val existingSession = call.sessions.get<UserSession>()
            if (existingSession == null) {
                // 强制注入测试用户会话
                val testSession = UserSession("test_001", "dev_test_admin")
                call.sessions.set(testSession)
                println("[开发模式]已自动登录测试用户: ${testSession.username}")
            }
        }
    }

    // 示例路由
    routing {
        get("/user-info") {
            val session = call.sessions.get<UserSession>() ?: run {
                call.respond(HttpStatusCode.Unauthorized)
                return@get
            }
            call.respondText("当前登录用户: ${session.username}")
        }
    }
}

方式二:JWT认证

在开发模式下自动生成测试JWT并注入请求头:

fun Application.module() {
    val isDevMode = environment.developmentMode
    
    if (isDevMode) {
        intercept(ApplicationCallPipeline.Call) {
            val authHeader = call.request.headers["Authorization"]
            if (authHeader == null) {
                // 生成测试JWT令牌
                val testToken = generateTestJwt("test_001", listOf("admin", "editor"))
                call.request.headers.append("Authorization", "Bearer $testToken")
            }
        }
    }
}

// 辅助生成测试JWT的函数
private fun generateTestJwt(userId: String, roles: List<String>): String {
    val testSecret = "your_dev_jwt_secret" // 替换为项目中的测试密钥
    return JWT.create()
        .withSubject(userId)
        .withClaim("roles", roles)
        .withExpiresAt(Date(System.currentTimeMillis() + 86400000)) // 有效期24小时
        .sign(Algorithm.HMAC256(testSecret))
}

注意事项

  • 务必保证该逻辑只有在开发模式下触发,避免生产环境泄露测试用户信息
  • 可根据项目实际使用的认证方案(如OAuth、API Key等)调整自动登录的实现逻辑

内容的提问来源于stack exchange,提问作者Jordi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 01:35:24