Ktor插件间数据共享:如何传递JWT配置属性
解决Ktor中复用配置属性的最佳方案
别用全局对象,咱们用更贴合Ktor设计的方式来实现配置复用:
1. 定义封装配置的数据类
先把JWT相关的配置字段封装成数据类,方便后续返回和解构:
data class JwtConfig( val secret: String, val issuer: String, val audience: String, val realm: String )
2. 修改配置读取函数返回数据类
调整你的配置读取函数,让它返回这个数据类,而不是只在内部定义变量:
fun Application.getJwtConfig(): JwtConfig { return JwtConfig( secret = environment.config.property("jwt.secret").getString(), issuer = environment.config.property("jwt.issuer").getString(), audience = environment.config.property("jwt.audience").getString(), realm = environment.config.property("jwt.realm").getString() ) }
(函数名改成getJwtConfig更贴合用途,你也可以保留原名称)
3. 在其他插件中直接复用
现在就能在configureJWTAuth里直接解构使用配置了:
fun Application.configureJWTAuth() { val (secret, issuer, audience, realm) = getJwtConfig() // 正常配置JWT认证逻辑 install(JWT) { this.realm = realm verifier( JWT .require(Algorithm.HMAC256(secret)) .withAudience(audience) .withIssuer(issuer) .build() ) // 其他JWT配置... } }
进阶方案:用Ktor的ApplicationAttributes存储配置
如果想更贴合Ktor插件生态,降低耦合度,可以把配置存入ApplicationAttributes:
首先定义一个属性Key:
val JWT_CONFIG_KEY = AttributeKey<JwtConfig>("JwtConfig")
然后在应用启动时加载配置并存入属性:
fun Application.installJwtConfig() { val jwtConfig = JwtConfig( secret = environment.config.property("jwt.secret").getString(), issuer = environment.config.property("jwt.issuer").getString(), audience = environment.config.property("jwt.audience").getString(), realm = environment.config.property("jwt.realm").getString() ) attributes.put(JWT_CONFIG_KEY, jwtConfig) }
在其他插件中通过属性获取配置:
fun Application.configureJWTAuth() { val jwtConfig = attributes[JWT_CONFIG_KEY] install(JWT) { realm = jwtConfig.realm verifier( JWT .require(Algorithm.HMAC256(jwtConfig.secret)) .withAudience(jwtConfig.audience) .withIssuer(jwtConfig.issuer) .build() ) } }
这种方式配置只加载一次,各个插件通过应用属性获取,耦合度更低,更符合Ktor的插件设计思路。
内容的提问来源于stack exchange,提问作者asfarasiknow
相关产品推荐
相关产品推荐

