• 关于spring项目中,security 对websocket请求和拦截问题


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 柒玖氵 2024-06-29 13:45 采纳率: 0% 浏览 68 首页/ 网络 / 关于spring项目中,security 对websocket请求和拦截问题 websocketspring boot 1. 问题:关于spring项目中,security 对websocket请求和拦截问题。2. 简述:采取netty来实现websocket连接,在api接口中测试可以连接,但是无法通过浏览器的连接工具进行直接连接。具体如图所示: 求解答 3. 补充说明 3.1 采用了spirng security的方式来进行认证了,开始认为是相关请求没有放行的原因,因此进行了请求配置,如下: @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers( "/websocket","/websocket/**" ); } @Override public void configure(HttpSecurity http) { // 一些其他的请求配置 http.authorizeRequests().antMatchers(authProperties.getIgnoreUri()).permitAll() .anyRequest().authenticated() .and().csrf().disable(); } ignoreUri的内容包含了/websocket和二级请求。但是这样配置之后还是无法从浏览器直接连接。于是将websocket拆开之后单独写了一个测试项目,发现可以进行访问,所以认为问题可能还是出现在spring拦截中,但是对于配置后还是没有结果,暂时无法找到新的解决思路,所以请求解答~ 3.2 在之前写到websocket时,都是以spring原生的方式去进行编写实现,以往的方式可以在WebSocketConfigurer中进行websocket的内容配置,如下: public class WebSocketConfig implements WebSocketConfigurer { @Resource public MyWebsocketHandler webSocketHandler; @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry .addHandler(webSocketHandler, "/websocket/event") // 指定自定义拦截器 .addInterceptors(new PaMessageWebSocketInterceptor()) // 允许跨域 .setAllowedOrigins("*"); // 其他handler... } } 发现这样是允许请求的。在使用nett来管理后,对应的编码和配置应该如何实现呢? 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    2条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-29 13:45
      关注

      引自免费微信小程序:皆我百晓生

      针对你的问题,我会尝试从以下几个方面进行解答。首先,关于Spring Security对WebSocket请求和拦截的问题,当使用Spring Boot和Spring Security时,确实需要对WebSocket进行特定的配置以确保其可以正确工作。在Spring应用中整合Netty作为底层的WebSocket提供者,通常要注意以下几个方面:

      1. 配置Spring Security以允许WebSocket连接

      在你的配置中,你已经使用了web.ignoring().antMatchers()来忽略WebSocket相关的路径,这是一个正确的做法。但你需要确保这个配置适用于你的项目上下文。通常Spring Security会与你的应用程序的URL模式相匹配进行配置。如果你在主项目中有其他的安全配置可能影响WebSocket的访问。确认其他安全配置不会覆盖或干扰你的WebSocket配置。

      2. 使用Spring Boot的WebSocket配置与Netty的结合

      既然你提到要使用Netty来管理WebSocket连接,那么你可能会需要自己管理WebSocket的部分逻辑而不是完全依赖Spring Boot的WebSocket支持。在这种情况下,你需要确保你的自定义WebSocket端点配置正确,并且与Spring Security的配置兼容。你可能需要自定义一个WebSocket的握手拦截器来确保安全认证。在Spring Boot中你可以通过实现HandshakeInterceptor接口来自定义握手过程。这允许你在握手前后添加额外的逻辑,例如验证用户身份等。然后你可以在你的WebSocket配置中注册这个拦截器。

      示例代码:自定义握手拦截器

      public class MyHandshakeInterceptor implements HandshakeInterceptor {
          @Override
          public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws Exception {
              // 这里可以进行安全验证,比如从请求中获取token进行验证等
              // 如果验证通过则返回true,否则返回false阻止握手
              return validateRequest(request); // 假设方法用于验证请求
          }
      
          @Override
          public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
              // 握手完成后的逻辑处理(如果需要的话)
          }
      }
      

      然后在你的WebSocket配置中注册这个拦截器:

      public class WebSocketConfig implements WebSocketConfigurer {
          @Override
          public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
              registry.addHandler(webSocketHandler, "/websocket/event")
                      .addInterceptors(new MyHandshakeInterceptor()) // 注册自定义握手拦截器
                      // 其他配置...
          }
      }
      

      3. 确保跨域设置正确

      允许跨域请求对于浏览器端连接WebSocket是非常重要的。在你的配置中,你使用了setAllowedOrigins("*")来允许所有来源的跨域请求,这通常是可以的,但在生产环境中可能需要更严格的设置。确保这个设置适用于你的应用场景。如果使用的是Netty,你还需要在Netty的ChannelPipeline中添加相应的跨域处理逻辑。

      总结:

      确保你的Spring Security配置允许WebSocket连接,整合自定义的WebSocket逻辑和正确处理跨域请求是解决问题的关键。如果问题仍然存在,可能需要更深入地检查你的项目配置和代码逻辑,特别是关于如何整合Spring Boot和Netty的部分。此外,查看详细的日志输出可以提供更多关于问题的线索,有助于定位和解决问题。

      展开全部

      评论 编辑记录
    • 张彦峰ZYF Java领域优质创作者 2024-07-28 14:13
      关注

      也就是你之前的项目在Spring Security中正确配置了WebSocket路径的放行,然后还添加了自己的拦截器,运行没有问题。
      但是如果你使用Netty来实现WebSocket连接的话:
      1.需要确保Netty的配置没有冲突,并且Spring Security不会拦截WebSocket请求。先检查你的Netty配置情况???
      2.确保Netty服务器和Spring应用程序在同一个端口上运行,并且正确处理WebSocket的握手请求。对了,再看看浏览器连接工具是否正确配置了WebSocket的URL和协议。
      先确认下这两个情况吧,希望对你有帮助!

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    华为云云耀云服务器L实例评测|部署项目管理工具 Focalboard
    Covalent(CQT)降低数据可用性成本,加快 Layer2 在 Web3 领域的扩张
    高等数学啃书汇总重难点(七)微分方程
    Spring Framework :WebClient 取代 RestTemplate
    AIR32F103(十) 在无系统环境和FreeRTOS环境集成LVGL
    JavaEE -- Spring的创建和使用
    我的前端合集
    计算机视觉与深度学习-卷积神经网络-卷积&图像去噪&边缘提取-卷积-[北邮鲁鹏]
    HAProxy(一)
    【Markdown】博客常用颜色、字体
  • 原文地址:https://ask.csdn.net/questions/8125296