使用 GlassFish 的基本身份验证和客户端证书身份验证

使用 GlassFish 的基本身份验证和客户端证书身份验证

我目前正在构建一个 Java-servlet 应用程序(具体来说,是在 GlassFish 上使用 Jersey)。在应用程序的某些部分,我需要使用基本身份验证对用户进行身份验证,而在其他一些部分,我需要使用客户端证书。使用哪一个将基于请求的路径。例如 /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>

答案1

不幸的是,客户端证书身份验证的工作方式是不同的层而不是应用程序。因此,最好的办法是将客户端重定向到需要客户端证书身份验证才能连接的其他 SSL 侦听端口。

例如

  1. 应用程序使用标准 SSL 连接进行连接,https://example.com/basic无需客户端证书验证。工作正常。
  2. 应用程序连接到https://example.com/cert使用标准 SSL 连接而无需客户端证书验证的服务器。然后重定向到https://example.com:8443/cert需要客户端证书验证的 SSL 连接。应用程序正常运行。

答案2

我通过创建两个单独的 Web 应用程序(即 IntelliJ 中的两个模块或 Eclipse 中的两个项目)解决了这个问题。这样,我可以分别配置身份验证机制,并为不同的路径使用不同的机制。

相关内容