解决方案:
-CometD 4.0.2版
-弹簧4.3.9.释放
-Spring Security 4.1.0.发布
通过使用“长池”,Spring正确解释了带有JSESSIONID的Cookie,我们在“用户上下文”中工作。切换到“websocket”后,就在运行消息接收代码之前,“用户上下文”似乎丢失了。
我们找不到合适的解决方案-以下代码在我看来只是一个黑客。但它对我们有用。
import org.cometd.bayeux.server.BayeuxServer;
import org.cometd.bayeux.server.ServerMessage;
import org.cometd.bayeux.server.ServerSession;
import org.cometd.server.DefaultSecurityPolicy;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
public class BayeuxAuthenticator extends DefaultSecurityPolicy implements ServerSession.RemoveListener {
// (...)
@Override
public boolean canHandshake( BayeuxServer server, ServerSession session, ServerMessage message ) {
SecurityContextHolder.getContext().setAuthentication( ( UsernamePasswordAuthenticationToken ) message.getBayeuxContext().getUserPrincipal() );
String user = securityService.getUserName();
// (...)
return true;
}
// (...)
}
SecurityContextHolder.getContext().setAuthentication( ( UsernamePasswordAuthenticationToken ) message.getBayeuxContext().getUserPrincipal() );
编辑2:
我们正在接收来自
String user = securityService.getUserName();
其中securityService是受Spring@Secured(/*预期角色*/)保护的Spring@Service(@安全批注在设置上下文之前生成us授权异常)
SecurityContextHolder.getContext().getUserPrincipal().getName()
但老实说,如果您只需要“用户主体”,那么从以下方面阅读就足够了:
message.getBayeuxContext().getUserPrincipal() // instanceof java.security.Principal
在我们的案例中是
org.springframework.security.authentication.UsernamePasswordAuthenticationToken
也许在你的情况下它是不同的子类?
WebSocket连接请求:
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,pl;q=0.8
Cache-Control: no-cache
Connection: Upgrade
Cookie: XSRF-TOKEN=<some token>; Idea-<some token>; lastOpenTab=sourcing/content; io=<some token>; BAYEUX_BROWSER=<some token>; JSESSIONID=<some token>
Host: localhost:8090
Origin: http://localhost:8090
Pragma: no-cache
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: NTtWtXAL8ReIB0LjvI2G0g==
Sec-WebSocket-Version: 13
Upgrade: websocket
User-Agent: Mozilla/5.0 ...