如何解决如何在响应式服务中提取JWT角色并在网关路由中使用它们?
我有一个Spring Cloud Gateway应用程序,该应用程序针对oauth2ResourceServer对承载jwt进行身份验证。 在我的路线中,我想访问从jwt中提取的角色。 我该怎么办?这是我的第一个反应式代码。
我的路线是:
@Bean
open fun myRoutes(builder: RouteLocatorBuilder,@Autowired webClient: WebClient,@Autowired grantedAuthoritiesExtractor: GrantedAuthoritiesExtractor) : RouteLocator? {
return builder.routes()
.route { p: PredicateSpec ->
p.path("/**")
.filters { f: GatewayFilterSpec -> f.addRequestHeader("Authorization","Bearer ${generateBearerToken(webClient)}") }
.uri("MY_SERVICE_URL")
}
.build()
}
我的配置是:
@EnableWebFluxSecurity
@Configuration
open class SecurityConfig {
@Bean
@Throws(java.lang.Exception::class)
open fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain {
http
.authorizeExchange()
.anyExchange().authenticated()
.and()
.oauth2ResourceServer()
.jwt()
.jwtAuthenticationConverter(grantedAuthoritiesExtractor())
return http.build()
}
fun grantedAuthoritiesExtractor(): Converter<Jwt,Mono<AbstractAuthenticationToken>> {
return ReactiveJwtAuthenticationConverterAdapter(GrantedAuthoritiesExtractor())
}
}
class GrantedAuthoritiesExtractor : JwtAuthenticationConverter() {
override fun extractAuthorities(jwt: Jwt): MutableCollection<GrantedAuthority> {
val claims = jwt.claims
// val marktId = claims["marktId"]
val realmAccess = claims["realm_access"] as JSONObject
val roles = realmAccess["roles"] as JSONArray
return roles.map { SimpleGrantedAuthority(it as String) }.toMutableList()
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。