Kotlin 中的授权与身份验证:Ktor、JWT 和 Spring Security

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Kotlin 中的授权与身份验证:全面解析



在现代 Kotlin Web 开发中,安全问题至关重要。授权(权限检查)和身份验证(确认用户身份)是关键机制,任何应用程序都离不开它们。本文将讲解如何使用流行的库:Ktor、Spring Security 和 JWT 来实现这些流程。



1. 基本概念

  • 身份验证 — 验证您是谁的过程(登录名/密码、令牌、OAuth)。
  • 授权 — 确定您被允许做什么(角色、访问权限)。
  • JWT(JSON Web Token) — 一种以 JSON 对象形式在各方之间传输数据的紧凑方式,并使用密钥进行签名。
  • Session — 在服务器上存储会话的经典方法。


2. 使用 Ktor 进行身份验证(Kotlin 服务器)

Ktor 是 JetBrains 开发的轻量级框架,非常适合在 Kotlin 中创建 REST API。其内置的身份验证支持允许您快速配置 JWT、Basic Auth 或 OAuth。



在 Ktor 中配置 JWT 身份验证的示例:

// build.gradle.ktsdependencies {    implementation("io.ktor:ktor-server-auth-jwt:$ktorVersion")}

// Application.ktimport io.ktor.server.auth.*import io.ktor.server.auth.jwt.*import com.auth0.jwk.JwkProviderBuilderimport java.util.*

fun Application.module() { install(Authentication) { jwt("auth-jwt") { verifier(JwkProviderBuilder("https://your-issuer.com/.well-known/jwks.json") .build() .get("your-kid")) validate { credential -> if (credential.payload.audience.contains("my-app")) { JWTPrincipal(credential.payload) } else null } } } routing { authenticate("auth-jwt") { get("/secure") { val principal = call.principal<JWTPrincipal>() val username = principal?.payload?.getSubject() call.respondText("Hello, $username!") } } }}

在此示例中,我们使用 JWTPrincipal 从令牌中提取用户数据。Ktor 会自动验证签名和有效期。



3. 通过 Spring Security 进行授权

Spring Boot 与 Kotlin 结合是企业级应用程序的强大组合。Spring Security 提供了灵活的过滤器和注解系统。



使用 JWT 的基本配置:

// build.gradle.ktsdependencies {    implementation("org.springframework.boot:spring-boot-starter-security")    implementation("io.jsonwebtoken:jjwt-api:0.12.3")    runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.3")    runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.3")}

// SecurityConfig.kt@Configuration@EnableWebSecurityclass SecurityConfig( private val jwtAuthenticationFilter: JwtAuthenticationFilter) { @Bean fun securityFilterChain(http: HttpSecurity): SecurityFilterChain { http .csrf { it.disable() } .sessionManagement { it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) } .authorizeHttpRequests { auth -> auth .requestMatchers("/api/auth/**").permitAll() .requestMatchers("/api/admin/**").hasRole("ADMIN") .anyRequest().authenticated() } .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter::class.java) return http.build() }}

// JwtAuthenticationFilter.kt@Componentclass JwtAuthenticationFilter( private val jwtService: JwtService) : OncePerRequestFi

推荐