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