从Tomcat单点登录中排除管理器

从Tomcat单点登录中排除管理器,tomcat,single-sign-on,jaas,tomcat-valve,tomcat-manager,Tomcat,Single Sign On,Jaas,Tomcat Valve,Tomcat Manager,在Tomcat服务器sans Apache上使用JAAS进行SSO。SSO控制对几个相关应用程序的访问,效果非常好。最近,我开始从Ant迁移到Maven,为了使用Maven的Tomcat插件,我需要设置Tomcat Manager应用程序,我以前不需要这样做。我能够让它与服务器上的其他webapp一起使用基本身份验证或客户端证书身份验证来启动和运行 我遇到的问题是,当用户在manager中进行身份验证时,其他Web应用程序的会话将被删除-即登录到Web应用程序、登录到manager、刷新Web应

在Tomcat服务器sans Apache上使用JAAS进行SSO。SSO控制对几个相关应用程序的访问,效果非常好。最近,我开始从Ant迁移到Maven,为了使用Maven的Tomcat插件,我需要设置Tomcat Manager应用程序,我以前不需要这样做。我能够让它与服务器上的其他webapp一起使用基本身份验证或客户端证书身份验证来启动和运行

我遇到的问题是,当用户在manager中进行身份验证时,其他Web应用程序的会话将被删除-即登录到Web应用程序、登录到manager、刷新Web应用程序、重定向到登录页面

通过在上下文级别定义SSO阀和在主机级别定义领域,我能够减轻这种重叠。这仍然允许SSO在通过浏览器在webapps之间导航时工作。但是,跨上下文AJAX请求和诸如此类的请求不会返回“用户未登录”错误,直到我访问另一个有问题的webapp。使用此方法,Manager的身份验证有效地与其他Web应用程序隔离

简而言之,我正在寻找通过SSL/数据库身份验证的SSO的最佳方法,该方法可用于使用JAAS身份验证模块的Web应用程序,但强制Tomcat将Manager从SSO中排除。IE SSO通过SSL用于Webapps 1、2、3,但UN/PW身份验证独立于Manager的SSO,身份验证独立于两者之间

有办法做到这一点吗

当前配置:

<Engine name="Catalina" defaultHost="localhost">

  <Host name="localhost" appBase="webapps"
        unpackWARs="true" autoDeploy="false"
        xmlValidation="false" xmlNamespaceAware="false">

    <Realm className="org.apache.catalina.realm.JAASRealm" appName="CustomLogin"
           userClassNames="com.foo.bar.User" roleClassNames="com.foo.bar.Role"
           useContextClassLoader="true" debug="false"/>
    <Valve className="org.apache.catalina.authenticator.SingleSignOn"/>

    <Context path="/Webapp1" docBase="webapp1">
        <ResourceLink name="jdbc/WEBAPP" global="jdbc/WEBAPP" type="java.sql.DataSource"/>
    </Context>

    <Context path="/Webapp2" docBase="webapp2">
        <ResourceLink name="jdbc/WEBAPP" global="jdbc/WEBAPP" type="java.sql.DataSource"/>
    </Context>

    <Context path="/Webapp3" docBase="Webapp3">
        <ResourceLink name="jdbc/WEBAPP" global="jdbc/WEBAPP" type="java.sql.DataSource"/>
    </Context>

    <Context path="/manager" docBase="manager" AntiJARLocking="false" antiResourceLocking="false" privileged="true" reloadable="false">
        <Realm className="org.apache.catalina.realm.MemoryRealm"></Realm>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="manager_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
    </Context>
  </Host>
</Engine>

使用此配置,所有webapps和Manager都在SSO的控制下,并发生上述重叠-即通过SSL登录到webapp1,然后通过UN/PW登录到Manager,然后刷新webapp1,重定向到登录页面


将SSO阀移动到webapps的上下文中可以解决此问题,但会导致跨上下文AJAX请求的“用户未登录”响应。

也许,更重要的是,我要寻找的是如何为特定上下文禁用SSO阀?如果我可以简单地说,除了这个上下文之外,其他的都适用,那么我的问题就解决了。显然这是一个已知的问题: