Если веб-сокет объявлен на странице, доступ к которой разрешён только зарегистрированным пользователям с определённой ролью, возможно, вы захотите добавить 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). Только сокеты в области видимости приложения остаются открытыми и по-прежнему доступны для сервера, даже если время жизни сессии или представления, связанного со страницей на стороне клиента, исткло.