1

我正在使用带有 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 结果。

4

2 回答 2

1

我也有这个问题。我偶然在另一个帖子上找到了答案。您必须server.xml按如下方式更新您的 in tomcat:

<Connector protocol="AJP/1.3" port="..." ...
tomcatAuthentication="false" />

tomcatAuthentication必须指定。一旦我进行了更新,反弹了tomcat,getRemoteUser()就为我工作了。

于 2014-02-06T20:00:20.627 回答
0

我永远无法检索 RemoteUser 标头,但我找到了authorization标头形式的解决方法。使用getHeader( "authorization" )以以下形式返回给我一个字符串:

Basic XXXX:YYYY

其中 X 是用户名,Y 是通过 Apache/mod_jk 访问页面的用户的密码。

'Basic' (X:Y) 后面的字符串部分是 Base64 编码的,因此在使用MiGBase64 对其进行解码后,我最终获得了一个可以使用的用户名。

于 2011-12-15T21:29:47.490 回答