使用mod_jk将用户名和客户端证书从apache传递到tomcat

问题描述 投票:0回答:1

我想通过ssl证书(针对自动性)或openid(针对人们,我正在使用auth0作为提供者)来验证Web服务。 Web服务使用jk在Tomcat Web服务器后面的tomcat容器中运行。 Web服务器已经对其他路径使用auth0(使用mod_auth_openidc)对用户进行了身份验证,并且只能通过https使用。我还有一个数据库,该数据库当前将auth0提供的用户名映射到角色(用于Apache中的授权)。

我希望具有以下功能:

  1. 找出用户名
    • 如果apache已经登录用户,请使用用户名
    • 如果请求中使用了客户端证书,请使用DN作为用户名
    • 如果以上都不是,则重定向以便apache进行身份验证
  2. 确定角色
    • 根据用户名进行数据库查找

我已经发现可能必须编写一个过滤器,从jk's proxy documentation看来,我可以从请求中获取证书和用户名。我写了以下代码:

package com.kodekonveyor.realm;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class KKAuthorizationFilter implements Filter {

private ServletContext context;

@Override
public void init(FilterConfig fConfig) throws ServletException {
    this.context = fConfig.getServletContext();
    this.context.log("KKAuthorizationFilter initialized");
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    String user = httpRequest.getRemoteUser();
    Object cert = httpRequest.getAttribute("javax.servlet.request.X509Certificate");
    this.context.log("user:"+user);
    this.context.log("cert:"+cert);
    chain.doFilter(request, response);

}

}

但是,当我尝试使用当前已通过身份验证的用户或客户端ssl身份验证访问servlet时,该用户和cert均记录为null。我怀疑我必须做一些更多的Apache配置才能使其正常工作。测试servlet位于tomcat中的/ servlet / servlet。

我具有以下Apache配置(为简洁起见,省略了部分)

DocumentRoot /var/www/repo

#correct OIDC configuration omitted

<VirtualHost myhost.mydomain.com:443>
    ServerName myhost.mydomain.com

DBDriver pgsql
#other DBD configurations are omitted

JkMount /servlet* worker1

<Directory /var/www/repo/servlet>
    DirectoryIndex off
    RewriteEngine Off
    AuthType openid-connect
    AllowOverride None
    AuthzDBDQuery "a correct database query"
    Require dbd-group allrepo
LogLevel debug
</Directory>

<Directory /var/www/repo>
    DirectoryIndex off
    RewriteEngine Off
    AllowOverride None
</Directory>

#correct letsencrypt configuration omitted
</VirtualHost>
apache tomcat authorization mod-jk
1个回答
0
投票

原因是,如果您在Location(或也许还有Directory)指令中有一个JkMount,所有其他授权和授权(甚至是所有其他?)指令都无效。

位于/ servlet的servlet的示例工作配置:

<Location "/servlet*">
        JkMount  worker1
</Location>
<LocationMatch /servlet.*>
    DirectoryIndex off
    RewriteEngine Off
    AuthType openid-connect
    AllowOverride None
    LogLevel debug
    Require valid-user
        SSLOptions +StdEnvVars
        SSLOptions +ExportCertData
        SSLVerifyClient require
</LocationMatch>
© www.soinside.com 2019 - 2024. All rights reserved.