微服务用token做认证,在websocket握手阶段可以对token进行认证,但还是实现不了点对点的推送?是不是必须得基于Session?
Spring WebSocket是可以使用token进行认证连接的,一定是你哪个部分配置错误导致的。
代码配置实例
/**
* WebSocket配置
* @author lnkToKing
*/
@Configuration
/*
* 开启使用STOMP协议来传输基于代理(message broker)的消息
* 启用后控制器支持作用@MessgeMapping注解
*/
@EnableWebSocketMessageBroke
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Value("${token-secret-key}")
private String tokenSecretKey;
//注册STOMP协议节点并映射url
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
//添加连接节点
registry.addEndpoint("/endpoint").addInterceptors(new HandshakeInterceptor() {
/**
* websocket握手
*/
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
ServletServerHttpRequest req = (ServletServerHttpRequest) request;
//获取token认证
String token = req.getServletRequest().getParameter("token");
//解析token获取用户信息
Principal user = parseToken(token);
if(user == null){ //如果token认证失败user为null,返回false拒绝握手
return false;
}
//保存认证用户
attributes.put("user", user);
return true;
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
}
}).setHandshakeHandler(new DefaultHandshakeHandler(){
@Override
protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler, Map<String, Object> attributes) {
//设置认证用户
return (Principal)attributes.get("user");
}
})
.setAllowedOrigins("*") //允许跨域
.withSockJS(); //指定使用SockJS协议
}
/**
* 根据token认证授权
* @param token
*/
private Principal parseToken(String token){
//TODO 解析token并获取认证用户信息
return null;
}
}