开发者社区> 问答> 正文

Spring securityspring WebSocketsockjs 跨域的认证失败?:报错

服务端使用的是,spring boot socket 服务,

认证服务 spring security.

客户端是 stompjs.

服务端配置:

@Configuration
@EnableWebSocketMessageBroker
@Order(1)
public class WebSocketConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/socket").setAllowedOrigins("*").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.setApplicationDestinationPrefixes("/app");
        config.enableSimpleBroker("/topic");
    }

    @Override
    public void customizeClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(new ChannelInterceptor() {
            @Override
            public Message<?> preSend(Message<?> message, MessageChannel channel) {
                StompHeaderAccessor accessor =
                        MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
                if (StompCommand.CONNECT.equals(accessor.getCommand())) {
                    List sessions = accessor.getNativeHeader("x-auth-token");
                    System.out.println(sessions.get(0));
                    // Authentication user = ...; // access authentication header(s)
                    //accessor.setUser(user);
                }
                return message;
            }
        });
    }

    @Override
    protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
        messages.nullDestMatcher().authenticated();
    }

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

"x-auth-token" 这个header 是客户端 认证的tokenId.

https://stackoverflow.com/questions/30887788/json-web-token-jwt-with-spring-based-sockjs-stomp-web-socket

参考这个,得知跨域要自己去判断认证.

现在问题来了,客户端传过来的是认证sessionid,不是用户,密码,我怎么拿到 Authentication 呢?

感谢大神们无私帮助,谢谢

展开
收起
kun坤 2020-06-05 22:56:30 830 0
1 条回答
写回答
取消 提交回答
  • @Autowired
    FindByIndexNameSessionRepository sessionRepository;
    SecurityContext securityContext = sessionRepository.findById(sessions.get(0).toString())
            .getAttribute("SPRING_SECURITY_CONTEXT");
    Authentication user = securityContext.getAuthentication(); // access authentication header(s)
    accessor.setUser(user);

    自己解决了

    2020-06-05 22:56:35
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多