Аутентификация предмета с помощью приложения Широ весной, в котором используется атмосфера для розеток - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть Spring-boot веб-приложение, которое использует Apache Shiro для управления безопасностью. Веб-приложение также использует инфраструктуру Atmosphere для связи через сокеты.

При работе с ним у меня есть требование аутентифицировать пользователя, который в данный момент вошел в систему, когда я получаю запрос / socket в атмосферу. Однако при попытке доступа к Shiro Subject я получаю следующую ошибку:

No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton.  This is an invalid application configuration.

У меня также есть фильтр , добавленный в мой SecurityManager для / socket . Несмотря на это, я продолжаю получать вышеуказанную ошибку, когда пытаюсь аутентифицировать пользователя с атмосферой для сокетных соединений.

Я довольно много искал в Интернете и не нашел ответа, который бы объяснял, что происходит полностью. Я обнаружил много постов, в которых упоминалось что-то о пуле потоков, используемом атмосферой, отличается от того, что выделено для запросов сервлета. Таким образом, асинхронные запросы, которые достигают атмосферы, не имеют контекста исходного пользователя. Я также прочитал обходной путь здесь , который является довольно старым. Я попробовал некоторые из вещей, упомянутых в комментариях.

Примечание: Я новичок в рамках Spring, Shiro и Atmosphere. Я понимаю вещи с точки зрения системного уровня.

Я был бы очень признателен, если бы смог получить какое-то объяснение (или ссылку, которая может помочь) относительно того, что происходит с каждой из этих вещей и почему она вызывает ошибку выше. Большинство онлайн-материалов, которые я читал об этом, кажутся очень расплывчатыми и не являются эксклюзивным ответом.

Если я не ошибаюсь, когда приложение Spring запускается, оно также загружает связанные классы Shiro и Atmosphere. Запросы поступают на сервер Apache и делегируются классу на основе аннотаций. Spring / Apache сохраняет для каждого запроса информацию (некоторые cookie или токен сеанса) , и последующие запросы отображаются в соответствии с этим. Однако информация, хранящаяся между запросами, которые попадают в конечные точки, связанные с атмосферой (например: onRequest ), а остальная часть не передается, поэтому я не могу использовать ту же информацию о субъекте.

Я искренне много искал, пытаясь понять, и хотел бы получить подробное объяснение. Я надеюсь, что этот вопрос не считается непригодным для форума.

Спасибо
Шабир

1 Ответ

0 голосов
/ 08 апреля 2019

Взгляните на документ по Thread Association в Широ

Ваше предположение кажется верным (догадка, поскольку я никогда не использовал Атмосферу).Пулы потоков разные.Как правило, есть два способа справиться с этим.Некоторые фреймворки позволяют вам добавлять данные в «контекст», и вы можете извлекать эти данные из вашего запущенного потока (очень похоже на контекст сервлета или Spring).Другой вариант (при условии, что у вас есть доступ для управления потоками Atmosphere), вы можете заключить их в:

Subject.execute(...)
...