一、问题背景
之前项目遇到过的问题,就是需要通过websocket给前端和小程序推送数据。因为nginx和wss的问题就不提,终于是通信连上并能发送接收数据了。但是之后有遇到一个需要鉴权的问题,之前用websocket没怎么考虑到鉴权的问题,正常使用起来好像也没有办法带token来过权限,都是直接把security解开来用。
二、自己的想法
一开始首先想到的就是在后面多带几个参数,通过@PathParam取出来只来进行验证,最简单的例如传个明文和一个密文,拿到后对比确认后,才把session放入集合里,再进行发送数据。但是后来想了一下,这样还是不可避免的会被别人连接上也防止不了别人推送数据上来,所以还是不行。
三、网上看到的方法
之前是通过@ServerEndpoint注入的:文章来源:https://www.toymoban.com/news/detail-429500.html
@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方法,把拦截器和文字数据处理都设置进去。拦截器里还是用两个参数一个明文一个密文进行比对判断是否有权限连接。文章来源地址https://www.toymoban.com/news/detail-429500.html
@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 (
到了这里,关于springboot整合websocket进行鉴权遇到的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!