Spring security 使用spring security在websocket会话上手动设置经过身份验证的用户

Spring security 使用spring security在websocket会话上手动设置经过身份验证的用户,spring-security,websocket,spring-boot,stomp,spring-websocket,Spring Security,Websocket,Spring Boot,Stomp,Spring Websocket,我正在开发一个Spring引导应用程序,它在websocket上使用STOMP消息传递,实现一个RPC模式,该模式公开公共(即:不需要任何身份验证)和私有方法 存在两个公共方法来注册和验证用户,因此我需要手动(以编程方式)处理用户登录,该方法通过自定义@MessageMapping操作访问 问题是:如何对websocket会话的用户进行身份验证 要使用普通MVC web应用程序实现类似的功能,我将使用类似于以下内容的代码: @MessageMapping("/auth") public Obje

我正在开发一个Spring引导应用程序,它在websocket上使用STOMP消息传递,实现一个RPC模式,该模式公开公共(即:不需要任何身份验证)和私有方法

存在两个公共方法来注册和验证用户,因此我需要手动(以编程方式)处理用户登录,该方法通过自定义@MessageMapping操作访问

问题是:如何对websocket会话的用户进行身份验证

要使用普通MVC web应用程序实现类似的功能,我将使用类似于以下内容的代码:

@MessageMapping("/auth")
public Object auth() {
  List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_TEST");
  SecurityContextHolder.getContext().setAuthentication(new PreAuthenticatedAuthenticationToken(myname, "dummy", authorities));
}
我得到一个错误:

org.springframework.messaging.simp.annotation.support.MissingSessionUserException: No "user" header in message

所以问题是:如何在auth()方法中手动验证用户,以便在myEndpoint()中正确解析主参数?

auth请求中的消息是什么样子的?您可能需要执行更高级别的操作,例如在安全筛选器中,以便在那里设置凭据。我一直在尝试解决类似的问题,这就是我通过在连接URL上传入auth令牌所做的。让我知道你在尝试什么,我们也许可以把它刷新一点。我有一个内部机制来授权用户,这涉及到服务器发送给客户端的挑战。客户端仅通过websocket访问应用程序,并且它不是基于web的,因此我不能依靠通过网页对用户进行预验证,因此我需要验证websocket频道。仍然不太清楚。您是否在连接后通过STOMP发送用户必须通过其他STOMP消息或其他方法响应的内容?目前,对于SpringWebSocket会话,必须在握手阶段(DefaultHandshakeHandler.determineUser())设置用户,并且WebSocket会话的主体没有设置器。Spring STOMP使用WebSocketSession将用户添加到STOMP头(在StompSubtocolHandler.handleMessageFromClient()中)。如果您愿意,我可以发布一些代码,尽管您可能需要更改一些流程才能使用它。是的,我已经使用STOMP实现了一个RPC模式:一些方法是“公共的”(即:不需要验证,只需打开websocket并进行调用),而其他方法需要验证用户,因此,一些公共方法是用于注册和验证的方法。请随意询问细节,同时我会尝试更好地说明问题。嗯,我不相信这种模式是受支持的。他们这样说@MessageMapping方法:“java.security.Principal方法参数反映了WebSocket HTTP握手时登录的用户。”基于此,如果他们在握手时是匿名的,就没有办法这样做。使用不同的端点进行身份验证通信怎么样?您可以使用公共的身份验证令牌,并让它们将身份验证令牌传递回另一个端点。
org.springframework.messaging.simp.annotation.support.MissingSessionUserException: No "user" header in message