在我的系统中,我使用自定义登录机制,因此tomcat和spring不知道经过身份验证的用户信息。当我订阅端点时:
stompClient.subscribe("/user/queue/position-updates", function(message) {...});
春天会抱怨“忽略消息,没有可用的主要信息”。我追溯到代码,并发现spring将尝试从DefaultUserDestinationResolver类中的会话中获取原则信息,但是不会获取任何内容,因此会给出错误消息。
我的问题是: 弹簧websocket是否依赖于tomcat或spring的安全机制? 我可以手动将经过身份验证的用户信息设置为http会话原理吗?
谢谢!
答案 0 :(得分:2)
WebSocketSession中的用户来自会话开始时的HttpServletRequest.getUserPrincipal()(即握手请求)。您可以包装HTTP请求(例如,从过滤器中)并覆盖返回用户的方法,也可以扩展DefaultHandshakeHandler(请参阅determineUser protected方法)。 Java和XML配置都提供了一种配置自定义HandshakeHandler的方法。
答案 1 :(得分:0)
你可以像这样实现HandshakeHandler。
$cars = $this->car->find('all', array(
'conditions' => array(
'car.id' => array(3, 10, 7)
),
'limit' => 3,
'order' => array('car.id' => 'desc')
));
}
然后在你的xml中声明它。
public class HandshakeHandler extends DefaultHandshakeHandler {
Logger logger = (Logger) LoggerFactory.getLogger(HandshakeHandler.class);
@Override
protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler, Map<String, Object> attributes) {
Principal principal = request.getPrincipal();
if(principal==null)
{
ServletServerHttpRequest req= (ServletServerHttpRequest)request;
HttpSession session = req.getServletRequest().getSession();
final User user = (User) session.getAttribute("user");
principal=new Principal() {
@Override
public String getName() {
return user!=null?user.getId():"";
}
};
}
logger.debug("principal:{}",principal);
return principal;
}