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

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

admin.authorizedJIDs   1048622@192.168.1.1
jdbcAuthProvider.passwordSQL select password from user where uid=?
jdbcAuthProvider.passwordType md5
jdbcProvider.connectionString  jdbc:mysql://192.168.1.2:3306/app?user=work&password=w2q5l0u1
jdbcProvider.driver com.mysql.jdbc.Driver
jdbcUserProvider.allUsersSQL select uid from user
jdbcUserProvider.emailField email
jdbcUserProvider.loadUserSQL select name,email from user where uid=?
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.JDBCAuthProvider
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.JDBCUserProvider
provider.vcard.className org.jivesoftware.openfire.vcard.DefaultVCardProvider
register.inband true
register.password true
update.lastCheck 1344306789871
xmpp.auth.anonymous true
xmpp.domain 192.168.1.1
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;
  }
其他字段都是以这种方式在程序中起的作用。

猜你喜欢

转载自chungang.iteye.com/blog/1625622