我想通过ssl证书(针对自动性)或openid(针对人们,我正在使用auth0作为提供者)来验证Web服务。 Web服务使用jk在Tomcat Web服务器后面的tomcat容器中运行。 Web服务器已经对其他路径使用auth0(使用mod_auth_openidc)对用户进行了身份验证,并且只能通过https使用。我还有一个数据库,该数据库当前将auth0提供的用户名映射到角色(用于Apache中的授权)。
我希望具有以下功能:
我已经发现可能必须编写一个过滤器,从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>
原因是,如果您在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>