springboot整合websocket进行鉴权遇到的问题

一、问题背景

之前项目遇到过的问题,就是需要通过websocket给前端和小程序推送数据。因为nginx和wss的问题就不提,终于是通信连上并能发送接收数据了。但是之后有遇到一个需要鉴权的问题,之前用websocket没怎么考虑到鉴权的问题,正常使用起来好像也没有办法带token来过权限,都是直接把security解开来用。

二、自己的想法

一开始首先想到的就是在后面多带几个参数,通过@PathParam取出来只来进行验证,最简单的例如传个明文和一个密文,拿到后对比确认后,才把session放入集合里,再进行发送数据。但是后来想了一下,这样还是不可避免的会被别人连接上也防止不了别人推送数据上来,所以还是不行。

三、网上看到的方法

之前是通过@ServerEndpoint注入的:

@Configuration
public class WebSocketConfig //implements WebSocketConfigurer
{
   

    /**
     * 使用spring boot时,使用的是spring-boot的内置容器,
     * 如果要使用WebSocket,需要注入ServerEndpointExporter
     *
     * @return
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
   
        return new ServerEndpointExporter();
    }
}
@ServerEndpoint(value="/ocwebsocket/{username}")
@Component
@Slf4j
public class WebsocketService {
   
}

在网上看到了一个方法,是设置拦截器,实现HandshakeInterceptor接口,然后在config里面重写registerWebSocketHandlers方法,把拦截器和文字数据处理都设置进去。拦截器里还是用两个参数一个明文一个密文进行比对判断是否有权限连接。

@Component
public class MyHandshakeInterceptor implements HandshakeInterceptor {
   
    /**
     * 握手之前,若返回false,则不建立链接 *
     *
     * @param request
     * @param response
     * @param wsHandler
     * @param attributes
     * @return
     */
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse
            response, WebSocketHandler wsHandler, Map<String, Object> attributes) {
   
        //将用户id放入socket处理器的会话(WebSocketSession)中
        ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest) request;
        //获取参数
        String userId = serverHttpRequest.getServletRequest().getParameter("userId");
        String sign = serverHttpRequest.getServletRequest().getParameter("sign");

        attributes.put("uid", userId);
        attributes.put("sign", sign);
        //可以在此处进行权限验证,当用户权限验证通过后,进行握手成功操作,验证失败返回false
        if (
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coderMoriarty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值