不发送标准Java客户端身份验证头

yzckvree  于 2022-10-23  发布在  Java
关注(0)|答案(1)|浏览(183)

当我尝试通过STOMP Java FX客户端发送auth标头时,它们不会被传递到Spring Boot后端。
客户端:

String URL = 'wss://myurl.de/wsconnection'
WebSocketClient client = new StandartWebSocketClient(client);
WebSocketStompClient stompClient = new WebSocketStompClient(client);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());

StompSessionHandler sessionHandler = new MyStompSessionHandler();
StompHeaders headers = new Headers();
headers.set("Authorization", "Bearer myToken")
headers.setLogin("Bearer myToken")
stompClient.connect(URL, sessionHandler,headers);

我尝试了两种方法:使用登录标头方法和定制的授权标头。所以在后端,我尝试通过这两个头中的一个获取JWT。不幸的是,JWT值始终为空,因此没有传递。
后端:

@Configuration
public class WebSocketSecurityConf extends AbstractSecurityWebSocketMessageBrokerConfigurer {
    @Override
    protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
        messages.anyMessage().permitAll();
    }

    @Override
    protected boolean sameOriginDisabled() {
        return true;
    }

}
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.setInterceptors(new ChannelInterceptorAdapter() {
            @Override
            public Message<?> preSend(Message<?> message, MessageChannel channel) {
                StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
                if (StompCommand.CONNECT.equals(accessor.getCommand())) {
                    String jwtToken;
                    jwtToken = accessor.getFirstNativeHeader("Authorization");
                    if(jwtToken == null){
                        jwtToken = accessor.getFirstNativeHeader("login");
                    }

                    System.out.println("webSocket token is "+ jwtToken);
                    System.out.println("accessor header "+ accessor.getMessageHeaders());

有什么好主意吗?

vlf7wbxs

vlf7wbxs1#

您混淆了这里参数的顺序:“stompClient.connect(URL, sessionHandler,headers);”头应该在处理程序之前。
以下是来自Spring的来源:public ListenableFuture<StompSession> connect(String url, @Nullable WebSocketHttpHeaders handshakeHeaders, @Nullable StompHeaders connectHeaders, StompSessionHandler handler, Object... uriVariables)

相关问题