Jakarta 认证 (原 JASPIC)

目录

简介

Tomcat 实现了 Jakarta 认证 3.1。此实现主要旨在使第三方认证实现与 Tomcat 集成。

Jakarta 认证可以通过以下两种方式之一进行配置

  • 在容器级别,通过静态配置文件 $CATALINA_BASE/conf/jaspic-providers.xml。采用此方法,所有必需的类都必须对 Tomcat 的 Common 类加载器可见,这通常意味着将 JAR 放在 $CATALINA_BASE/lib 中。
  • 在 Web 应用程序级别,通过使用 Jakarta 认证 API 进行动态配置。采用此方法,所有必需的类都必须对 Web 应用程序类加载器可见,这通常意味着将 JAR 放在 Web 应用程序的 WEB-INF/lib 目录中。

用户应注意,如果静态 Jakarta 认证配置文件为给定的 Web 应用程序配置了 Jakarta 认证,则 Jakarta 认证配置将优先于 Web 应用程序的 WEB-INF/web.xml 文件中存在的任何 <login-config>

静态配置

AuthConfigProvider

如果第三方实现包含 AuthConfigProvider,则可以通过在 $CATALINA_BASE/conf/jaspic-providers.xml 文件中的 <jaspic-providers> 元素内嵌套以下内容来配置 Web 应用程序使用它。

<provider name="any"
          className="fully.qualified.implementation.class.Name"
          layer="HttpServlet"
          appContext="Catalina/localhost /contextPath"
          description="any">
  <property name="see-provider-documentation"
            value="see-provider-documentation" />
</provider>

namedescription 属性不被 Tomcat 使用。

className 属性必须是 AuthConfigProvider 的完全限定类名。该实现可以与 Web 应用程序一起打包,或放置在 Tomcat 的 $CATALINA_BASE/lib 目录中。

layer 属性必须是 HttpServlet

appContext 属性必须是以下内容的精确拼接

  • 引擎名称
  • 正斜杠字符
  • 主机名
  • 一个空格
  • 上下文路径

如果 AuthConfigProvider 支持通过属性进行配置,则可以通过嵌套在 <provide> 元素内的 <property> 元素来指定这些属性。

ServerAuthModule

如果第三方实现仅提供一个 ServerAuthModule,则需要提供一些支持类。这些可以是自定义实现,或者,Tomcat 也为 ServerAuthModule 提供了简单的包装器实现。

Tomcat 的 ServerAuthModule 包装器可以通过在 $CATALINA_BASE/conf/jaspic-providers.xml 文件中的 <jaspic-providers> 元素内嵌套以下内容进行配置。

<provider name="any"
          className="org.apache.catalina.authenticator.jaspic.SimpleAuthConfigProvider"
          layer="HttpServlet"
          appContext="Catalina/localhost /contextPath"
          description="any">
  <property name="org.apache.catalina.authenticator.jaspic.ServerAuthModule.1"
            value="fully.qualified.implementation.class.Name" />
  <property name="see-provider-documentation"
            value="see-provider-documentation" />
</provider>

此配置与上一节中的 AuthConfigProvider 类似,但有一些关键区别。

className 属性必须是 org.apache.catalina.authenticator.jaspic.SimpleAuthConfigProvider

ServerAuthModule(s) 通过属性指定。属性名称必须是 org.apache.catalina.authenticator.jaspic.ServerAuthModule.n,其中 n 是模块的索引。索引必须从 1 开始,并以 1 的步长递增,直到所有模块都定义完毕。属性的值必须是模块的完全限定类名。

动态配置

Jakarta 认证模块和配置可以与 Web 应用程序一起打包在 WAR 文件中。然后,Web 应用程序可以在启动时使用标准的 Jakarta 认证 API 注册所需的 Jakarta 认证配置。

如果正在使用并行部署,则不应使用动态配置。Jakarta 认证 API 假定任何给定主机的上下文路径是唯一的,这在使用并行部署时并非如此。在使用并行部署时,应使用静态 Jakarta 认证配置。这将要求应用程序的所有版本使用相同的 Jakarta 认证配置。

第三方模块

这不是一个详尽的列表。Tomcat 社区欢迎对本节进行补充的贡献。

Philip Green II 的 Google OAuth 2 模块

此模块的源代码以及包含所需 Google API 配置详细信息的文档可在 GitHub 上获取。

在 Tomcat 中使用此模块的示例配置如下所示

<jaspic-providers xmlns="https://tomcat.net.cn/xml"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="https://tomcat.net.cn/xml jaspic-providers.xsd"
                  version="1.0">
  <provider name="google-oauth"
            className="org.apache.catalina.authenticator.jaspic.SimpleAuthConfigProvider"
            layer="HttpServlet"
            appContext="Catalina/localhost /contextPath"
            description="Google OAuth test">
    <property name="org.apache.catalina.authenticator.jaspic.ServerAuthModule.1"
              value="com.idmworks.security.google.GoogleOAuthServerAuthModule" />
    <property name="oauth.clientid"
              value="obtained-from-Google-console" />
    <property name="oauth.clientsecret"
              value="obtained-from-Google-console" />
    <property name="ignore_missing_login_context"
              value="true" />
  </provider>
</jaspic-providers>