JBoss EAP 7.1+IIS环境下Windows域登录配置指导请求
从EAP 5.1迁移到7.1后,AJP认证传递的逻辑有不少变化,你之前的配置缺了几个核心环节,我帮你梳理下完整的配置步骤:
1. 确保AJP连接器配置正确
首先在standalone-full.xml里找到AJP连接器,必须明确设置tomcat-authentication="false",让JBoss跳过自身认证,信任IIS传递的用户信息:
<connector name="ajp" protocol="AJP/1.3" scheme="http" socket-binding="ajp" tomcat-authentication="false"/>
同时确认系统属性已经正确设置(你之前做了这步,但再核对下):
<system-properties> <property name="org.apache.coyote.ajp.DEFAULT_TOMCAT_AUTHENTICATION" value="false"/> </system-properties>
2. 配置专属安全域(关键!)
EAP 7.1需要专门的安全域来提取IIS通过AJP传递的REMOTE_USER值,在standalone-full.xml的security-domains节点下添加:
<security-domain name="IISAuthDomain" cache-type="default"> <authentication> <login-module code="org.jboss.security.auth.spi.RequestHeaderLoginModule" flag="required"> <!-- 指定从REMOTE_USER头获取用户名 --> <module-option name="principalHeader" value="REMOTE_USER"/> <!-- 忽略JBoss自身的安全约束,因为IIS已经做了认证 --> <module-option name="ignoreSecurityConstraints" value="true"/> <!-- 如果不需要传递角色可以留空,这里设为REMOTE_ROLES备用 --> <module-option name="rolesHeader" value="REMOTE_ROLES"/> </login-module> </authentication> </security-domain>
这个登录模块的作用是直接从请求属性中提取已认证的用户名,不需要再次校验密码。
3. 配置Web应用的安全关联
3.1 修改jboss-web.xml
在你的Web应用的WEB-INF目录下(没有就新建)添加jboss-web.xml,关联刚才的安全域:
<jboss-web> <security-domain>IISAuthDomain</security-domain> <!-- 可选:关闭审计避免冗余日志 --> <disable-audit>true</disable-audit> </jboss-web>
3.2 调整web.xml配置
更新web.xml的登录配置和安全约束,确保应用知道要使用IIS的NTLM认证:
<!-- 登录配置 --> <login-config> <auth-method>NTLM</auth-method> <realm-name>IISAuthDomain</realm-name> </login-config> <!-- 安全约束:保护所有资源,允许任意已认证用户访问 --> <security-constraint> <web-resource-collection> <web-resource-name>All Application Resources</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>*</role-name> </auth-constraint> </security-constraint> <!-- 定义通配角色 --> <security-role> <role-name>*</role-name> </security-role>
4. 检查ISAPI Redirect配置
确认IIS侧的isapi_redirect.properties里开启了NTLM支持:
enable_ntlm=1
同时确保worker.properties里的AJP worker配置正确,指向JBoss的AJP端口(默认8009)。
5. 调试验证
如果还是有问题,开启JBoss的调试日志排查:
在standalone-full.xml里添加日志配置:
<logger category="org.jboss.security"> <level name="DEBUG"/> </logger> <logger category="org.apache.coyote.ajp"> <level name="DEBUG"/> </logger>
重启后查看日志,确认请求中是否包含REMOTE_USER属性,以及安全域是否正确提取了用户名。
做完这些配置后,重启JBoss和IIS,应该就能通过facesFacade.getExternalContext().getUserPrincipal().getName()获取到Windows认证后的用户名了。
内容的提问来源于stack exchange,提问作者samuebe

