鉴权与安全
握手阶段 token、Origin 校验。
30 分钟
鉴权与安全
WebSocket 没有 每次消息的 Cookie 自动重发语义与 REST 相同,但握手仍是 HTTP,可在 Upgrade 前完成鉴权。实验台需与 sb-security / Sa-Token 对齐。
学习目标
- 在握手阶段校验 JWT 或 Session
- 配置
setAllowedOrigins防 CSWSH - 理解 STOMP 连接后的授权
握手带 Token
方式一:Query(简单,注意日志泄露)
const ws = new WebSocket(`wss://host/ws?token=${accessToken}`);
方式二:Cookie(同源推荐)
浏览器同源请求自动带 Sa-Token cookie;Spring 在 HandshakeInterceptor 里读 HttpSession。
public class AuthHandshakeInterceptor implements HandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,
WebSocketHandler wsHandler, Map<String, Object> attributes) {
// 从 cookie / header 取 token,校验后把 userId 写入 attributes
attributes.put("userId", currentUserId);
return true; // false → 握手失败 403
}
}
注册:registry.addEndpoint("/ws").addInterceptors(authInterceptor)...
Origin 校验
registry.addEndpoint("/ws")
.setAllowedOrigins("https://coderoadmap.local"); // 生产禁用 *
与 Nginx Host / ngx-proxy 传递一致,防恶意站点跨站 WebSocket 劫持。
STOMP 层授权
configureClientInboundChannel 拦截 SUBSCRIBE:比对 destination 与 ACL(REST 创建实验间时写入成员列表)。生产用 wss://;Token 优先 Cookie/Header,避免进 access log;速率限制可结合 redis-essentials。
练习
- 无 token 握手应返回 403,用 curl 验证 Upgrade 失败
- 对照 sb-jwt 复用同一 JwtParser
- 设计:用户 A 能否订阅用户 B 的 private
/queue?
小结
鉴权在握手完成,授权在订阅/发送时复核。 下一课水平扩展。
加载本节练习…