openfire集成现有数据库,以及在源码中的实现

[size=medium]一、集成数据库的设置
在使用openfire的过程中,如果需要用到已有的数据库里面的用户来登录的时候,需要再openfire自己的数据库中ofProperty表里面新增、以及修改一些字段,修改之后如下所示:

admin.authorizedJIDs 1048622@[color=red]192.168.1.1[/color]
jdbcAuthProvider.passwordSQL select password from user where uid=?
jdbcAuthProvider.passwordType md5
jdbcProvider.connectionString [color=red]jdbc:mysql://192.168.1.2:3306/app?user=work&password=w2q5l0u1[/color]
jdbcProvider.driver com.mysql.jdbc.Driver
jdbcUserProvider.allUsersSQL select uid from user
jdbcUserProvider.emailField email
jdbcUserProvider.loadUserSQL select name,email from user where [color=red]uid[/color]=?
jdbcUserProvider.nameField name
jdbcUserProvider.userCountSQL select count(*) from user
jdbcUserProvider.usernameField name
passwordKey EXOrfCVaNU9sq9X
provider.admin.className org.jivesoftware.openfire.admin.DefaultAdminProvider
provider.auth.className org.jivesoftware.openfire.auth.[color=red]JDBC[/color]AuthProvider
provider.group.className org.jivesoftware.openfire.group.DefaultGroupProvider
provider.lockout.className org.jivesoftware.openfire.lockout.DefaultLockOutProvider
provider.securityAudit.className org.jivesoftware.openfire.security.DefaultSecurityAuditProvider
provider.user.className org.jivesoftware.openfire.user.[color=red]JDBC[/color]UserProvider
provider.vcard.className org.jivesoftware.openfire.vcard.DefaultVCardProvider
register.inband true
register.password true
update.lastCheck 1344306789871
xmpp.auth.anonymous true
xmpp.domain [color=red]192.168.1.1[/color]
xmpp.session.conflict-limit 0
xmpp.socket.ssl.active true
需要说明的是xmpp.domain 字段可以填写openfire所在服务器的域名或者IP, connectionString是需要集成的数据库地址,loadUserSQL里面的uid是你需要通过它来登录的,还有,这些Sql里面的字段一定要保证需要集成的数据库里面是存在的。

二、上面的设置如何在程序中起作用

程序里有AuthFactory和UserManger分别用来处理provider.auth.className和provider.user.className。

AuthFactory类里有一个私有属性
private static AuthProvider authProvider = null;

JDBCAuthProvider继承自这个接口AuthProvider ,AuthFactory里面有个初始化AuthProvider的方法:

private static void initProvider() {
String className = JiveGlobals.getProperty("provider.auth.className",
"org.jivesoftware.openfire.auth.DefaultAuthProvider");
// Check if we need to reset the auth provider class
if (authProvider == null || !className.equals(authProvider.getClass().getName())) {
try {
Class c = ClassUtils.forName(className);
authProvider = (AuthProvider)c.newInstance();
}
}
该方法将authProvider 设置为ofProperty中provider.auth.className字段设置的值。
UserManger对JDBCUserProvider进行了类似的处理。


下面在源码里面查看org.jivesoftware.openfire.auth.JDBCAuthProvider 和org.jivesoftware.openfire.user.JDBCUserProvider这两个类
以JDBCAuthProvider为例,JDBCAuthProvider有几个私有的属性:
private String connectionString;
  private String passwordSQL;
  private PasswordType passwordType;
在对JDBCAuthProvider进行初始化的时候,对这几个属性进行了如下的赋值:
connectionString = JiveGlobals.getProperty("jdbcProvider.connectionString");
passwordSQL= JiveGlobals.getProperty("jdbcAuthProvider.passwordSQL");
passwordType = PasswordType.plain;
try {
passwordType = PasswordType.valueOf(
JiveGlobals.getProperty("jdbcAuthProvider.passwordType", "plain"));
}
其中JiveGlobals是专门用来处理数据库的类。
因为connectionString被赋值为你在ofProperty里面所填写的值,所以该类在调用获取连接的方法getConnection()中获取了指向待集成数据库的地址。
return DriverManager.getConnection(connectionString);

在调用获取密码的方法getPasswordValue()的时候,对PreparedStatement的设置的内容就是passwordSQL,如下:

private String getPasswordValue(String username) {
...
try {
con = getConnection();
pstmt = con.prepareStatement(passwordSQL);
pstmt.setString(1, username);

...
}

return password;
  }
其他字段都是以这种方式在程序中起的作用。[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值