Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Вопросы безопасности в веб-сокетах

Если веб-сокет объявлен на странице, доступ к которой разрешён только зарегистрированным пользователям с определённой ролью, возможно, вы захотите добавить URL push-запроса в число URL-ов с ограниченным доступом.

URL push-запроса состоит из префикса URI /javax.faces.push/, за которым следует имя канала. В примере управляемой контейнером безопасности, который уже ограничивает доступ к странице /user/foo.xhtml для зарегистрированных пользователей с ролью USER шаблоном URL /user/* в web.xml, см. ниже:

<security-constraint>
<web-resource-collection>
<web-resource-name>Restrict access to role USER.
</web-resource-name>
<url-pattern>/user/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>USER</role-name>
</auth-constraint>
</security-constraint>

Если страница /user/foo.xhtml содержит <f:websocket channel = "foo">, то необходимо добавить ограничение доступа для шаблона URL push-запроса из /javax.faces.push/foo, как показано ниже:

<security-constraint>
<web-resource-collection>
<web-resource-name>Restrict access to role USER.
</web-resource-name>
<url-pattern>/user/*</url-pattern>
<url-pattern>/javax.faces.push/foo</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>USER</role-name>
</auth-constraint>
</security-constraint>

В качестве дополнительной защиты, особенно для общедоступных каналов, которые не могут быть защищены ограничениями безопасности, тег f:websocket зарегистрирует все ранее объявленные каналы в текущей сессии HTTP, и любой входящий запрос на открытие веб-сокета будет проверяться. соответствует ли он этим каналам в текущей сессии HTTP. Если канал неизвестен (например, случайно угадан, подделан конечными пользователями или повторно подключён вручную после истечения сессии), тогда веб-сокет будет немедленно закрыт с кодом причины закрытия CloseCodes.VIOLATED_POLICY (1008). Кроме того, когда сессия HTTP будет завершена, все каналы области видимости сессии и представления, которые всё ещё открыты, будут явно закрыты со стороны сервера с кодом причины закрытия CloseCodes.NORMAL_CLOSURE (1000). Только сокеты в области видимости приложения остаются открытыми и по-прежнему доступны для сервера, даже если время жизни сессии или представления, связанного со страницей на стороне клиента, исткло.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)