Доступ к объекту UserDetails в сеансе Websocket Spring MVC

В вызове, отправленном через соединение через веб-сокет в приложении Spring MVC 4, я могу получить объект java.security.Principal при добавлении this в качестве параметра в метод.

Однако в основном это только имя пользователя, и мне нужен (расширенный) объект UserDetails, созданный во время входа в систему.

SecurityContextHolder.getContext().getAuthentication() возвращает null. Как я понял, потому что spring создает специальную сессию для обработки соединений через веб-сокет.

Вопрос: есть ли способ получить доступ к контексту безопасности изнутри сеанса/потока веб-сокета?

(Также достаточно иметь доступ к сеансовому компоненту).


person user2132072    schedule 17.09.2014    source источник
comment
Для других: я работал над этой проблемой, используя Spring Session. projects.spring.io/spring-session. Мне это решение совсем не понравилось, поскольку оно требует от меня сохранения сопоставления между сеансами веб-сокетов и сеансом https. Чувствует себя уродливым и небезопасным, но я должен был заставить его работать. Оставим этот вопрос открытым, чтобы получить более элегантные решения.   -  person user2132072    schedule 08.07.2015


Ответы (3)


@AuthenticationPrincipal специально для методов REST/MVC.

Однако вы можете приблизиться к этому, добавив аргумент типа java.security.Principle к вашему аннотированному методу @MessageMapping, а затем взяв из него реальный объект UserDetails следующим образом:

FooUserDetails currentUser = (FooUserDetails) ((Authentication) user).getPrincipal();

Это работает для меня для Spring Boot 1.5.4

person ashirley    schedule 15.09.2017

Я полагаю, вы расширили AbstractWebSocketHandler.

у вас может быть основное имя:

@Override
public void afterConnectionEstablished ( WebSocketSession session ) throws Exception {
    logger.info ( "afterConnectionEstablished = " + session.getPrincipal () );
}
person Radu Toader    schedule 06.07.2015
comment
Мне это нужно в методах, вызываемых onMessage (с @MessageMapping). - person user2132072; 08.07.2015

Я не проверял это, но вы должны иметь доступ к своему пользователю, добавляя параметр, например

@AuthenticationPrincipal CustomUser customUser

к вашему методу @MessageMapping.

Вы можете найти больше здесь: http://docs.spring.io/spring-security/site/docs/4.0.x/reference/htmlsingle/#mvc-authentication-principal

person Alessandro Polverini    schedule 17.06.2015
comment
Интересная аннотация (не знала о ее существовании). Однако может сработать: я не могу проверить это, чтобы убедиться в этом. - person user2132072; 08.07.2015
comment
@AuthenticationPrincipal работает только для методов контроллера REST, а не для веб-сокетов. Ссылка, на которую вы ссылаетесь, предназначена специально для mvc. - person Babyburger; 15.02.2021