REMOTE_USER没有被Apache2设置?

时间:2011-12-13 19:48:20

标签: netbeans apache2 glassfish-3 mod-jk

我正在使用Netbeans和Glassfish 3.1开展项目,并尝试实施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

workers.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>

RemoteUser.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控制面板中注册了一个监听器:

enter image description here

简而言之,我不知道为什么会不断返回null并且我在互联网上的搜索没有任何帮助。提前感谢您提供的任何意见。

注意:httpServletRequest.getRemoteUser( )提供相同的空结果。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

Basic XXXX:YYYY

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

“基本”(X:Y)后面的字符串部分是Base64编码的,所以在用MiGBase64解码后,我终于获得了一个我可以使用的用户名。