как пользовательский пользователь в весеннем загрузочном websocket без весенней безопасности [дубликат]

В конце я сделал:

controller: class {
    constructor($http, Restangular, $state) {
        Object.assign(this, {$http, Restangular, $state});
    }
    doMe() {
       // use this.$http, this.Restangular & this.$state freely here
    }
}
13
задан Community 23 May 2017 в 11:46
поделиться

2 ответа

Я пытался понять websockets и столкнулся с этим вопросом. Был полностью разочарован, чтобы не найти ответа. Вот что для будущего читателя.

Предполагаю, что у читателя есть основное понимание весенних веб-карт с использованием Stomp.

Мы знаем, что мы можем отправлять сообщения клиенту с сервера stomp с использованием префиксов тем, на которые он подписан, например,. /topic/hello. Мы также знаем, что мы можем отправлять сообщения конкретному пользователю, потому что spring предоставляет API convertAndSendToUser(username, destination, message). Он принимает имя пользователя String, что означает, что если у нас есть уникальное имя пользователя для каждого соединения, мы должны иметь возможность отправлять сообщения определенным пользователям, подписанным на тему.

Что еще не понятно, откуда это имя пользователя from?

Это имя пользователя является частью интерфейса java.security.Principal. Каждый объект StompHeaderAccessor или WebSocketSession имеет экземпляр этого принципала, и вы можете получить от него имя пользователя. Однако, согласно моим экспериментам, он не генерируется автоматически. Он должен генерироваться вручную сервером для каждого сеанса.

Чтобы использовать этот интерфейс, вы должны его реализовать.

class StompPrincipal implements Principal {
    String name

    StompPrincipal(String name) {
        this.name = name
    }

    @Override
    String getName() {
        return name
    }
}

Затем вы можете сгенерировать уникальный StompPrincipal для каждого соединения, переопределив DefaultHandshakeHandler. Вы можете использовать любую логику для генерации имени пользователя. Вот одна потенциальная логика, которая использует UUID:

class CustomHandshakeHandler extends DefaultHandshakeHandler {
    // Custom class for storing principal
    @Override
    protected Principal determineUser(ServerHttpRequest request,
                                      WebSocketHandler wsHandler,
                                      Map<String, Object> attributes) {
        // Generate principal with UUID as name
        return new StompPrincipal(UUID.randomUUID().toString())
    }
}

. Наконец, вам нужно настроить свои веб-сайты для использования вашего пользовательского обработчика рукопожатия.

@Override
void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
    stompEndpointRegistry
         .addEndpoint("/stomp") // Set websocket endpoint to connect to
         .setHandshakeHandler(new CustomHandshakeHandler()) // Set custom handshake handler
         .withSockJS() // Add Sock JS support
}

Это он. Теперь ваш сервер настроен на создание уникального имени участника для каждого подключения. Он передаст этот принцип как часть объектов StomHeaderAccessor, к которым вы можете получить доступ через прослушиватели событий соединения, функции MessageMapping и т. Д. ...

Из прослушивателей событий:

@EventListener
void handleSessionConnectedEvent(SessionConnectedEvent event) {
    // Get Accessor
    StompHeaderAccessor sha = StompHeaderAccessor.wrap(event.getMessage())
}

Из сообщения Mapped APIs

@MessageMapping('/hello')
protected void hello(SimpMessageHeaderAccessor sha, Map message) {
    // sha available in params
}

Последняя заметка об использовании convertAndSendToUser(...). При отправке сообщений пользователю вы будете использовать что-то вроде этого

convertAndSendToUser(sha.session.principal.name, '/topic/hello', message)

. Однако для подписки на клиента вы будете использовать

client.subscribe('/user/topic/hello', callback)

. Если вы подписываете клиента на /topic/hello вы будете получать только широковещательные сообщения.

14
ответ дан Siddharth Garg 19 August 2018 в 03:33
поделиться
0
ответ дан Wenneguen 30 October 2018 в 15:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: