Active Directory(AD)域認證已成企業級內網系統(ERP、OA、CRM)安全整合的標準配置。單點登錄(SSO)讓使用者一次登錄即可訪問所有互信應用,是當前企業業務整合的主流方案。本文示範如何利用 JCIFS 庫在 Java Web 應用中實現基於 NTLM 的 AD 域透明認證。
下載 jcifs-1.3.15.jar(或更新版本)並放入 Tomcat 的 webapps/你的項目/WEB-INF/lib 目錄。
在 web.xml 中註冊 NtlmHttpFilter,關鍵參數說明:
<filter>
<filter-name>NtlmHttpFilter</filter-name>
<filter-class>jcifs.http.NtlmHttpFilter</filter-class>
<init-param>
<param-name>jcifs.http.domainController</param-name>
<param-value>10.10.2.153</param-value> <!-- 域控制器 IP -->
</init-param>
<init-param>
<param-name>jcifs.util.loglevel</param-name>
<param-value>3</param-value> <!-- 日誌級別 -->
</init-param>
<!-- 可選:指定用於驗證的域帳號/密碼,若省略則嘗試使用運行進程的身份 -->
<init-param>
<param-name>jcifs.smb.client.username</param-name>
<param-value>domain_user</param-value>
</init-param>
<init-param>
<param-name>jcifs.smb.client.password</param-name>
<param-value>password</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>NtlmHttpFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
401 Unauthorized 並攜帶 WWW-Authenticate: NTLM 標頭。DOMAIN\\user)綁定到 HttpServletRequest.getRemoteUser()。在 Controller 或 Service 中即可透過標準 API 獲取域帳號:
String domainUser = request.getRemoteUser(); // 格式:DOMAIN\\username
String username = domainUser.contains("\\") ? domainUser.split("\\\\")[1] : domainUser;
若專案已使用 Spring Security,可直接引入 spring-security-kerberos 模組,配置 SpnegoAuthenticationProcessingFilter 替代 JCIFS Filter,獲得更豐富的授權擴展點與 Session 管理。