XMPP Openfire集成windows身份认证
OpenFire可以很方便的集成已有数据库类别的系统的用户认证,通常的应用中还会遇到和Windows的身份认证集成,下面对方法总结一下:
一、集成本地Windows用户管理
此方法用openfire本身已经实现的NativeAuthProvider类进行验证,设置步骤如下:
1. 安装openfire 3.7.0;
2. 将openfire_3_7_0\openfire\resources\nativeAuth\win32-x86\下的shaj.dll文件复制到Java\jdk1.6.0_23\bin\下;
3. 运行openfire.exe;
4. 点击Launch Admin,配置好后,在打开的浏览器中输入正确的管理员帐户和密码,登录;
5. 在“服务器—服务器管理器—系统属性”中,将“provider.auth.className”的属性值修改为“org.jivesoftware.openfire.auth.NativeAuthProvider”并保存属性
6. 至此,再登录openfire服务器必须用正确的本机windows用户名及密码。由于默认只有用户名admin为管理员,建议在windows下新建admin用户或增加openfire的管理员帐户。
二、集成Windows AD
通过JAAS的开源库,我们也可以自己实现一个AD认证的Provider
1. 下载waffle http://waffle.codeplex.com/
2、编译Provider的实现类并包含guava-r07.jar、jna.jar、platform.jar、waffle-jna.jar,形成一个jar包,并复制到openfire_3_7_0\openfire\lib下
3、Openfire的provider.auth.className设置为我们实现的类即可
具体的实现如下
import waffle.windows.auth.impl.WindowsAuthProviderImpl;
public class NTLMAuthProvider implements AuthProvider {
private static final Logger Log = LoggerFactory.getLogger(NTLMAuthProvider.class);
public NTLMAuthProvider() {
}
public void authenticate(String username, String password) throws UnauthorizedException {
if (username.contains("@")) {
// Check that the specified domain matches the server's domain
int index = username.indexOf("@");
String domain = username.substring(index + 1);
if (domain.equals(XMPPServer.getInstance().getServerInfo().getXMPPDomain())) {
username = username.substring(0, index);
} else {
// Unknown domain. Return authentication failed.
throw new UnauthorizedException();
}
}
try {
WindowsAuthProviderImpl wapi=new WindowsAuthProviderImpl();
wapi.logonUser(username,password);
}
catch (Exception e) {
throw new UnauthorizedException(e);
}
}
public void authenticate(String username, String token, String digest) throws UnauthorizedException {
throw new UnsupportedOperationException();
}
public boolean isPlainSupported() {
return true;
}
public boolean isDigestSupported() {
return false;
}
public String getPassword(String username) throws UserNotFoundException, UnsupportedOperationException {
throw new UnsupportedOperationException();
}
public void setPassword(String username, String password) throws UserNotFoundException {
throw new UnsupportedOperationException();
}
public boolean supportsPasswordRetrieval() {
return false;
}
}
关键解读
以上的实现主要就是依据Java的JAAS规范,然后读取Windows账户和AD服务信息,实现用户的验证。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)