Использование как базовой аутентификации, так и аутентификации по сертификату клиента с GlassFish
В настоящее время я создаю приложение Java-сервлета (если точнее, использую Jersey на GlassFish). В некоторых частях приложения мне нужно аутентифицировать пользователя с помощью базовой аутентификации, а в некоторых других частях мне нужно использовать клиентские сертификаты. Какой из них будет использован, будет зависеть от пути запроса. Например, /cert/secretMethod1 или /basic/secretMethod2 .
Как я могу это сделать? Ниже мой текущий web.xml, который в настоящее время выполняет только базовую аутентификацию. Я думаю, мне нужно использовать два разных, но я бы предпочел использовать только одну область аутентификации. Существуют ли теги / атрибуты для web.xml, которые позволяют мне указывать разные методы аутентификации для разных путей приложения?
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>
TestServer
</display-name>
<servlet>
<description>Jersey servlet</description>
<display-name>Jersey servlet</display-name>
<servlet-name>JerseyServlet</servlet-name>
<servlet-class>
com.sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JerseyServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<security-constraint>
<display-name>TestServer</display-name>
<web-resource-collection>
<web-resource-name>TestServer</web-resource-name>
<description></description>
<url-pattern>/</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
<http-method>HEAD</http-method>
<http-method>PUT</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
<http-method>DELETE</http-method>
</web-resource-collection>
<auth-constraint>
<description>Have to be a USER</description>
<role-name>User</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>jpaCustomRealm</realm-name>
</login-config>
<security-role>
<description/>
<role-name>User</role-name>
</security-role>
</web-app>
2 ответа
К сожалению, аутентификация сертификата клиента работает не на уровне приложения, а на другом уровне. Поэтому лучше всего перенаправить клиента на другой порт прослушивания SSL, для подключения которого требуется проверка подлинности сертификата клиента.
Например
- Приложение подключается к
https://example.com/basic
который использует стандартное соединение SSL без подтверждения сертификации клиента. Работает как обычно. - Приложение подключается к
https://example.com/cert
который использует стандартное соединение SSL без подтверждения сертификации клиента. Затем перенаправляется наhttps://example.com:8443/cert
это соединение SSL, которое требует проверки сертификата клиента. Приложение работает как обычно.
Я решил это, создав два отдельных веб-приложения (т.е. два модуля в IntelliJ или два проекта в Eclipse). Таким образом, я мог настроить механизмы аутентификации отдельно и иметь разные механизмы для разных путей.