Назад | Перейти на главную страницу

Использование как базовой аутентификации, так и аутентификации по сертификату клиента с 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>

К сожалению, проверка подлинности сертификата клиента работает на другой слой чем приложение. Итак, лучше всего было бы перенаправить клиента на другой порт прослушивания SSL, для подключения которого требуется проверка подлинности сертификата клиента.

Например.

  1. Приложение подключается к https://example.com/basic который использует стандартное соединение SSL без проверки сертификата клиента. Работает нормально.
  2. Приложение подключается к https://example.com/cert который использует стандартное соединение SSL без проверки сертификата клиента. Затем перенаправляется на https://example.com:8443/cert это SSL-соединение, которое требует проверки сертификата клиента. Приложение работает как обычно.

Я решил это, создав два отдельных веб-приложения (то есть два модуля в IntelliJ или два проекта в Eclipse). Таким образом, я мог настроить механизмы аутентификации отдельно и использовать разные механизмы для разных путей.