当前位置: 首页 > 知识库问答 >
问题:

Spring RSocket安全JWT访问被拒绝错误

晏沈义
2023-03-14

我正在尝试使用Spring Boot RSocket与安全使用JWT令牌。它给我一个拒绝访问的错误,没有其他有用的信息来帮助调试?

拒绝访问
ApplicationErrorException(0x201):app//io.rsocket.exceptions.exceptions.from(exceptions.java:76)处的app//io-rsocket.core.RSocketRequester.handleFrame(rsocket Requester.java:261)处的app//io.rsocket.core.RSocketRequester.handleIncomingFrames(RSocker.core.publisher.LambdaSubscriber.onNext(Lambda订阅服务器.java:160)处的访问被拒绝app//io.rsocket.core.ClientServerInputMultiplexer$InternalDuplexConnection.onNext(ClientServerInputMultiplexer.java:248),位于app//io.rsocket.core.ClientServerInput Multiplex.onNext,位于app//io.rsoket.core.ClientServer InputMultiplexer。onNextapp//reactor.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:725)的app//reator.netty.channel.ChannelOperations.on入站下一步(FluxReceive.java:364)app//io.netty.channel.AcchannelOperationsHandler.channelRead(ChannelOperations Handler.java:93)位于app//io.netty.cchannel.AbstractChannelHandlerContext.invokeChannelReads(AbstractchannelHandllerContext.java:379)位于app//io.netthy.channel.AbstractHandlerContrext.invokeChannel读取app//io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:327),app//io.netty.hhandler.codec.ByteTo消息Decoder.channelReads(BytetoMessageDecoders.java:299),app//io.netthy.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractchannelHannelHanderContext.java:379)app//io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractchannelHandllerContext.java:365)位于app//io.netty.cchannel.AbtractChannellHandlerContrext.fireChannel读取(Abstract ChannelhannelHanderContext.jawa:357)位于app//io.netty.channel.DefaultChannelPipeline$HeadContext.channellRead(DefaultChannel管道.java:1410app//io.netty.channelapp//io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:722 leThreadEventExecutor$4.运行app//io.netty.util.internal.ThreadExecutorMap$2.run上的(SingleThreadEventExecutor.java:997java.base@11.0.14/java.lang.Thread.run(Thread.java:834)

安全配置文件

@Configuration
@EnableRSocketSecurity
@EnableReactiveMethodSecurity
class SecurityConfig {

    @Bean
    fun authorization(rsocketSecurity: RSocketSecurity): PayloadSocketAcceptorInterceptor {
        val security: RSocketSecurity =
            rsocketSecurity.authorizePayload { authorize: RSocketSecurity.AuthorizePayloadsSpec ->
                authorize
                    .anyRequest().authenticated()
                    .anyExchange().permitAll()
            }
                .jwt { jwtSpec ->
                    jwtSpec.authenticationManager(jwtReactiveAuthenticationManager(jwtDecoder()))
                }
        return security.build()
    }

    @Bean
    fun jwtDecoder(): ReactiveJwtDecoder {
        return TokenUtils.jwtAccessTokenDecoder()
    }

    @Bean
    fun jwtReactiveAuthenticationManager(decoder: ReactiveJwtDecoder): JwtReactiveAuthenticationManager {
        val converter = JwtAuthenticationConverter()
        val authoritiesConverter = JwtGrantedAuthoritiesConverter()
        authoritiesConverter.setAuthorityPrefix("ROLE_")
        converter.setJwtGrantedAuthoritiesConverter(authoritiesConverter)
        val manager = JwtReactiveAuthenticationManager(decoder)
        manager.setJwtAuthenticationConverter(ReactiveJwtAuthenticationConverterAdapter(converter))
        return manager
    }

    @Bean
    fun rsocketMessageHandler() = RSocketMessageHandler() .apply {
        argumentResolverConfigurer.addCustomResolver(AuthenticationPrincipalArgumentResolver())
        routeMatcher = PathPatternRouteMatcher()
        rSocketStrategies = rsocketStrategies()
    }

    @Bean
    fun rsocketStrategies() = RSocketStrategies.builder()
        .routeMatcher(PathPatternRouteMatcher())
        .build()
}

消息控制器文件

@MessageMapping("api.v1.messages")
@Controller
class MessageController {

    @MessageMapping("stream")
    suspend fun receive(
        @Payload inboundMessages: Flow<String>,
        @AuthenticationPrincipal jwt: String
    ) {
        println("MessageController: jwt: $jwt")
        println("MessageController: inbound message: " + inboundMessages.first())
    }
}

使用MessageControllerTest文件进行测试

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class MessageControllerTest(
    @Autowired val rsocketBuilder: RSocketRequester.Builder,
    @LocalServerPort val serverPort: Int
) {

    @ExperimentalTime
    @ExperimentalCoroutinesApi
    @Test
    fun `test that messages API streams latest messages`() {
        val admin = HelloUser(userId = "9527", password = "password", role = HelloRole.ADMIN)

        val token: UserToken = TokenUtils.generateAccessToken(admin)!!

        val authenticationMimeType: MimeType =
            MimeTypeUtils.parseMimeType(WellKnownMimeType.MESSAGE_RSOCKET_AUTHENTICATION.string)

        runBlocking {
            val rSocketRequester = rsocketBuilder.websocket(URI("ws://localhost:${serverPort}/rsocket"))

            launch {

                rSocketRequester.route("api.v1.messages.stream")
                    .metadata(token.token!!, authenticationMimeType)
                    .dataWithType(flow {
                        emit(
                            "Hey from test class"
                        )
                    })
                    .retrieveFlow<Void>()
                    .collect()
            }
        }
    }
}

我已经将剩下的代码示例添加到GitHub中https://github.com/CJMobileApps/rsocket-jwt-security-example

共有1个答案

麹高远
2023-03-14

我想通了。RSocket目前有一个bug或者只是错误的文档。JWTs BearerTokenMetadata的MimeType。BEARER _ authentic ation _ MIME _ TYPE 表示已弃用,并使用< code > MIME TYPE utils . parse MIME TYPE(well knownmimetype。MESSAGE _ r socket _ authentic ation . string)来代替,然而这并不起作用。

当传递令牌时,继续使用/useBearerTokenMetadata.BEARER_AUTHENTICATION_MIME_TYPE和令牌字符串。

.metadata(token.token!!, BearerTokenMetadata.BEARER_AUTHENTICATION_MIME_TYPE)
 类似资料:
  • 我已经创建了谷歌应用程序引擎项目,使用预测Api 1.5v。当我在本地均值localhost:8888使用谷歌o2Auth身份验证与客户端ID和客户端运行时,它对我来说工作正常secret.but当我实时运行它时,它会给出一个错误 Java语言安全AccessControlException:访问被拒绝(“java.io.FilePermission”“/base/data/home/apps/s

  • 我正在用Java RMI编写一个客户机-服务器程序,但遇到了一个错误: java.security.访问控制异常:拒绝访问(java.net.SocketPersion127.0.0.1:1099连接,解析) 我的代码如下: 怎么了?

  • 问题内容: 在某种程度上,当我尝试通过命令行访问MySQL时,已经设法解决了该错误: 我尝试使用此HowTo重置密码,但没有任何运气。 我已经卸载了mysql completley并重新安装了,但是仍然需要输入密码。我不知道为什么会这样! 有人可以帮我获得默认安装的MySQL吗? 环境 Fedora Core 10,完全根访问权限,安装了Apache和PHP 感谢您的任何帮助!! 编辑 对于所有想

  • 我最近才更新到新版本的forge,没有改变我的设置,当我去构建我的应用程序时,我得到了一个错误,说它找不到文件…

  • 这个问题已经问过好几次了,但没有一个解决办法对我有效。我以管理员身份运行DOS命令窗口,但当运行keytool命令安装证书时,我得到了上面的错误: 我在Windows10上使用JDK 1.8.0_191。为什么拒绝对管理员的访问?

  • 问题内容: 这是我的编辑从第27行到第39行的代码: 我认为我的问题可能与Win7教授有关:(访问被拒绝) 如何解决这个问题,或者我需要做些什么或阅读才能使它起作用? 谢谢你不燃烧。 我只是更改了文件夹选项,使我获得完整的(Access …),现在我只需要弄清楚为什么在运行javac VendingMachine.java时为什么没有得到任何输出,我想是有一个新问题。 问题答案: 您的工作目录为。