我正在使用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控制面板中注册了一个监听器:
简而言之,我不知道为什么会不断返回null并且我在互联网上的搜索没有任何帮助。提前感谢您提供的任何意见。
注意:httpServletRequest.getRemoteUser( )
提供相同的空结果。
答案 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解码后,我终于获得了一个我可以使用的用户名。