Есть приложение на Spring boot 2, в котором пользователи авторизуюца и получают access key. Клиентская часть крутится на nodejs. В браузере у пользователя хранится access key. Я хочу после авторизации пользователя соединется с WebSocket и производить обмен/приём сообщениями, но есть проблема в том, что когда подключаюсь к WebSocket, то проверяется наличие в Header кода доступа, который я не знаю как запихать.
Вот как описан WebSocket на сервере
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer
{
@Override
public void registerStompEndpoints(StompEndpointRegistry registry)
{
registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry)
{
registry.setApplicationDestinationPrefixes("/app");
registry.enableSimpleBroker("/topic");
}
}
Контроллер
@Controller
public class ChatController
{
@MessageMapping("/chat.sendMessage")
@SendTo("/topic/public")
public ChatMessage sendMessage(@Payload ChatMessage chatMessage)
{
return chatMessage;
}
@MessageMapping("/chat.addUser")
@SendTo("/topic/public")
public ChatMessage addUser(@Payload ChatMessage chatMessage, SimpMessageHeaderAccessor headerAccessor)
{
// Add username in web socket session
headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
return chatMessage;
}
}
Клиентская часть
connect() {
this.socket = new SockJS("http://127.0.0.1:8099/application/ws");
this.stompClient = Stomp.over(this.socket);
this.stompClient.connect(
{
Authorization: "Bearer " + localStorage.getItem("user-token")
},
frame => {
this.connected = true;
// eslint-disable-next-line
console.log(frame);
this.stompClient.subscribe("/topic/public", tick => {
// eslint-disable-next-line
console.log(tick);
this.received_messages.push(JSON.parse(tick.body).content);
});
notificationUtils.methods.showSuccessNotification(
"Соединение установлено"
);
},
error => {
// eslint-disable-next-line
console.log(error);
notificationUtils.methods.showErrorNotification(
"Ошибка соединения: " + error.reason
);
this.connected = false;
}
);
}
Для работы на клиенте с WebSocket использую sockjs-client и webstomp-client. Пытаюсь добавить Authorization при коннекции, но когда запрос доходит до фильтра прав, то нет в header ключа.
private String getJwtFromRequest(HttpServletRequest request)
{
String bearerToken = request.getHeader("Authorization");
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer "))
{
return bearerToken.substring(7, bearerToken.length());
}
return null;
}
Если у кого-то были такие же ситуации, посоветуйте как быть. Может есть другие библиотеки на клиент, чтобы можно было добавить ключ в header
Решение описано здесь В кратце, в настройках безопасности надо открыть полный доступ на сокет. В настройках сокета описать дополнить ChannelInterceptor в методе configureClientInboundChannel
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Задача: подключить БД Postgresql 11 к проекту на React для получения оттуда данныхНе могу найти документацию, соответствующую реальности или примеры...