我正在开发一个Spring引导应用程序,它使用实现RPC模式的websocket进行STOMP消息传递,该模式暴露公共(即:无需经过身份验证)和私有方法。
存在两种公共方法来注册和验证用户,因此我需要手动(以编程方式)处理用户登录,通过自定义@MessageMapping操作访问的方法。
问题是:如何验证websocket会话的用户?
要使用普通的MVC Web应用程序进行类似的操作,我会使用类似于此的代码:
@MessageMapping("/auth")
public Object auth() {
List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_TEST");
SecurityContextHolder.getContext().setAuthentication(new PreAuthenticatedAuthenticationToken(myname, "dummy", authorities));
}
但这似乎在websocket环境中不起作用,因为当用户使用这样的方法时:
@MessageMapping("/myendpoint")
public Object myEndpoint(Param params, Principal principal) {...}
我收到错误:
org.springframework.messaging.simp.annotation.support.MissingSessionUserException: No "user" header in message
所以问题是:如何在auth()方法中手动验证用户,以便在myEndpoint()中正确解析Principal参数?