我正在使用带有 Glassfish 3.1 的 Netbeans 开发一个项目,并且正在尝试实现 LDAP 授权。为此,我还有一个使用 mod_jk 的启用 LDAP 的 Apache2 服务器。要点是,当用户访问站点上 /sng/ 目录中的任何页面时,Apache 服务器应要求提供凭据并将用户转发到运行站点该部分的 Glassfish 服务器。
Apache 正在正确排队并接受 LDAP 凭据,然后将用户转发到适当的区域。但似乎 REMOTE_USER 变量不是由 Apache 设置和/或不是由 mod_jk 发送的。相关配置文件和代码片段如下:
httpd.conf
<Location />
AuthBasicProvider ldap
AuthLDAPURL ldap://mainframe/ou=People,dc=dtch,dc=com?uid?sub
AuthzLDAPAuthoritative off
AuthType Basic
AuthName "LDAP"
require valid-user
Options Indexes FollowSymLinks MultiViews +Includes
</Location>
conf.d/jk
JKWorersFile /path/to/workers.properties
JkShmFile /path/to/mod_jk.shm
JkLogFile /path/to/mod_jk.log
JkLogLevel info
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
worker.properties
worker.list=worker1
worker.worker1.port=8009
worker.worker1.host=127.0.0.1
worker.worker1.type=ajp13
启用站点/000-默认
...
JkMount /*.jsp worker1
JkMount /sng/* worker1
web.xml
<filter>
<filter-name>RemoteUser</filter-name>
<filter-class>path.to.RemoteUser</filter-class>
</filter>
<filter-mapping>
<filter-name>RemoteUser</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
远程用户.java
//...
public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain )
throws IOException, ServletException
{
if( request instanceof HttpServletRequest )
{
HttpServletRequest httpServletRequest = ( HttpServletRequest )request;
String username = httpServletRequest.getHeader( "REMOTE_USER" );
if( username == null )
{
// enter here every time
}
// ...
}
//...
}
最后我在 Glassfish 控制面板中注册了一个监听器:
简而言之,我不知道为什么不断返回 null 并且我在互联网上的搜索没有任何帮助。提前感谢您提供的任何意见。
注意:httpServletRequest.getRemoteUser( )
提供相同的 null 结果。