openfire扩展小试 整合现有系统用户 

如果我想使用现有系统的用户/组(部门),而不想使用openfire再去管理一套用户/组,用openfire可以非常方便的整合现有系统用户。 

进入openfire管理控制台-服务器-服务管理器-系统属性 
可以发现如下配置 
provider.auth.className 
org.jivesoftware.openfire.auth.DefaultAuthProvider 
*用户验证
provider.group.className 
org.jivesoftware.openfire.group.DefaultGroupProvider 
*获取组相关数据 
provider.user.className 
org.jivesoftware.openfire.user.DefaultUserProvider 
*获取用户相关数据 
这些Provider是openfire默认自己管理用户组 

但同时openfire还提供了支持JDBC相关的Provider,可以从其它的数据源获取用户/组数据 
将上面三个属性分别修改为 
org.jivesoftware.openfire.auth.JDBCAuthProvider 
org.jivesoftware.openfire.group.JDBCGroupProvider 
org.jivesoftware.openfire.user.JDBCUserProvider 

然后,需要配置一下数据源,添加如下属性 
jdbcProvider.driver 
*数据源驱动 
jdbcProvider.connectionString 
*连接字符串 

对每一个JDBC Provider需要配置相关的SQL语句和属性(在系统属性里添加项目) 

JDBCAuthProvider 
jdbcAuthProvider.passwordSQL 
*获取用户密码的SQL 
*输入参数:登录名 
*输入列:密码 
*例:SELECT pwd FROM user WHERE name=? 
jdbcAuthProvider.passwordType 
*密码类型可以是:plain(文本),md5,sha1 
*如果你的密码加密不为以上三种 就需要自己提供一个AuthProvider,在下一章会专门介绍 


JDBCGroupProvider 
jdbcGroupProvider.allGroupsSQL 
*获取所有组的SQL 
*输入参数:无 
*输出列:组的KEY 
*例:SELECT sn FROM department 

jdbcGroupProvider.descriptionSQL 
*获取组的名称(描述) 
*输入参数:组记录的KEY 
*输出列:组的名称(描述) 
*例:SELECT name FROM department where sn=? 

jdbcGroupProvider.groupCountSQL 
*获取组的数量 
*输入参数:组的KEY 
*输出列:组的数量 
*例:SELECT count(sn) FROM department 

jdbcGroupProvider.loadAdminsSQL 
*获取组的管理员 
*输入参数:组记录的KEY 
*输出列:组管理员的KEY 
*例:SELECT admin FROM department where sn=? 

jdbcGroupProvider.loadMembersSQL 
*获取组的成员 
*输入参数:组的KEY 
*输出列:组成员的KEY(集合) 
*例:SELECT usersn FROM department_user where departmentsn=? 

jdbcGroupProvider.userGroupsSQL 
*获取成员的组 
*输入参数:成员的KEY 
*输出列:成员所性组的KEY 
*例:SELECT departmentsn FROM department_user where usersn=? 



JDBCUserProvider 
jdbcUserProvider.allUsersSQL 
*获取所有用户 
*输入参数:无 
*输出列:用户的KEY 
*例:SELECT sn from user 

jdbcUserProvider.userCountSQL 
*获取所有用户数量 
*输入参数:无 
*输出列:用户数量 
*例:SELECT count(sn) from user 

jdbcUserProvider.loadUserSQL 
*获取用户信息 
*输入参数:用户的KEY 
*输出列:登录名,名称,email(至少应该这三列,下面要用到) 
*例:SELECT loginname,name,email from user where sn =? 

jdbcUserProvider.emailField 
*指定用户email的列名如:email 
jdbcUserProvider.nameField 
*指定用户名称的列名如:name 
jdbcUserProvider.usernameField 
*指定用户登录名的列名如:loginname 


最后 还需要配置新的管理员用户 
admin.authorizedJIDs 
*指定新数据源中的管理员用户注意是是完整JID(user@域名) 
*例:admin@server.cn 

配置好如上属性 重启openfire 
使用admin.authorizedJIDs中的用户名登录openfire管理控制台 
如果配置成功,进入openfire管理控制台-用户/组 
就可以看到你数据源中的用户/组信息了 
同时可以使用spark登录进行测试 


此外,如果在调试过程中出现问题 无法登录openfire管理控制台 
可以直接修改openfire数据库中的 OFPROPERTY表 

分享到:  
评论
5 楼 lookdd1 2010-04-01  
hetylei 写道
lookdd1 写道
请问,整合现有数据库为oracle的时候如何写这个jdbcProvider.connectionString啊?用户名和密码写在什么地方?jdbc:oracle:thin:@[HOST]:1521:[INSTANCE]?name=?&password=?


我直接加了三个属性  囧

Java代码  收藏代码
  1. /**  
  2.      * 初始化  
  3.      * 比JDBCAuthProvider多支持  
  4.      * [b]JiveGlobals.migrateProperty("jdbcProvider.url");  
  5.         JiveGlobals.migrateProperty("jdbcProvider.user");  
  6.         JiveGlobals.migrateProperty("jdbcProvider.password");[/b]  
  7.      */    
  8.     public BfmpAuthProvider() {    
  9.         // Convert XML based provider setup to Database based    
  10.         JiveGlobals.migrateProperty("jdbcProvider.driver");    
  11.         JiveGlobals.migrateProperty("jdbcProvider.url");    
  12.         JiveGlobals.migrateProperty("jdbcProvider.user");    
  13.         JiveGlobals.migrateProperty("jdbcProvider.password");    
  14.     
  15.         JiveGlobals.migrateProperty("jdbcAuthProvider.passwordSQL");    
  16.         JiveGlobals.migrateProperty("jdbcAuthProvider.passwordType");    
  17.         JiveGlobals.migrateProperty("jdbcAuthProvider.setPasswordSQL");    
  18.         JiveGlobals.migrateProperty("jdbcAuthProvider.allowUpdate");    
  19.         JiveGlobals.migrateProperty("jdbcAuthProvider.passwordType");    
  20.     
  21.         // Load the JDBC driver and connection string.    
  22.         String jdbcDriver = JiveGlobals.getProperty("jdbcProvider.driver");    
  23.         try {    
  24.             Class.forName(jdbcDriver).newInstance();    
  25.         }    
  26.         catch (Exception e) {    
  27.             Log.error("Unable to load JDBC driver: " + jdbcDriver, e);    
  28.             return;    
  29.         }    
  30.         [b]connectionString = JiveGlobals.getProperty("jdbcProvider.url");    
  31.         user = JiveGlobals.getProperty("jdbcProvider.user");    
  32.         password = JiveGlobals.getProperty("jdbcProvider.password");[/b]    
  33.     
  34.         // Load SQL statements.    
  35.         passwordSQL = JiveGlobals.getProperty("jdbcAuthProvider.passwordSQL");    
  36.         setPasswordSQL = JiveGlobals.getProperty("jdbcAuthProvider.setPasswordSQL");    
  37.     
  38.         allowUpdate = JiveGlobals.getBooleanProperty("jdbcAuthProvider.allowUpdate",false);    
  39.     
  40.         passwordType = PasswordType.plain;    
  41.         try {    
  42.             passwordType = PasswordType.valueOf(    
  43.                     JiveGlobals.getProperty("jdbcAuthProvider.passwordType""plain"));    
  44.             Log.error("PasswordType:"+ passwordType);    
  45.         }    
  46.         catch (IllegalArgumentException iae) {    
  47.             Log.error(iae);    
  48.         }    
  49.     }    


晕死,原来不光我不知道JDBC连接Oracle的连接描述符还有   jdbc:oracle:thin:username/password@机器名:1521:[instance] 这种写法啊。。呵呵。还有一个就是机器名改成IP也不行,为这事搞了一天。。多谢楼主的文章和楼主的回复!
4 楼 hetylei 2010-03-30  
lookdd1 写道
请问,整合现有数据库为oracle的时候如何写这个jdbcProvider.connectionString啊?用户名和密码写在什么地方?jdbc:oracle:thin:@[HOST]:1521:[INSTANCE]?name=?&password=?


我直接加了三个属性  囧

Java代码  收藏代码
  1. /**  
  2.      * 初始化  
  3.      * 比JDBCAuthProvider多支持  
  4.      * [b]JiveGlobals.migrateProperty("jdbcProvider.url");  
  5.         JiveGlobals.migrateProperty("jdbcProvider.user");  
  6.         JiveGlobals.migrateProperty("jdbcProvider.password");[/b]  
  7.      */    
  8.     public BfmpAuthProvider() {    
  9.         // Convert XML based provider setup to Database based    
  10.         JiveGlobals.migrateProperty("jdbcProvider.driver");    
  11.         JiveGlobals.migrateProperty("jdbcProvider.url");    
  12.         JiveGlobals.migrateProperty("jdbcProvider.user");    
  13.         JiveGlobals.migrateProperty("jdbcProvider.password");    
  14.     
  15.         JiveGlobals.migrateProperty("jdbcAuthProvider.passwordSQL");    
  16.         JiveGlobals.migrateProperty("jdbcAuthProvider.passwordType");    
  17.         JiveGlobals.migrateProperty("jdbcAuthProvider.setPasswordSQL");    
  18.         JiveGlobals.migrateProperty("jdbcAuthProvider.allowUpdate");    
  19.         JiveGlobals.migrateProperty("jdbcAuthProvider.passwordType");    
  20.     
  21.         // Load the JDBC driver and connection string.    
  22.         String jdbcDriver = JiveGlobals.getProperty("jdbcProvider.driver");    
  23.         try {    
  24.             Class.forName(jdbcDriver).newInstance();    
  25.         }    
  26.         catch (Exception e) {    
  27.             Log.error("Unable to load JDBC driver: " + jdbcDriver, e);    
  28.             return;    
  29.         }    
  30.         [b]connectionString = JiveGlobals.getProperty("jdbcProvider.url");    
  31.         user = JiveGlobals.getProperty("jdbcProvider.user");    
  32.         password = JiveGlobals.getProperty("jdbcProvider.password");[/b]    
  33.     
  34.         // Load SQL statements.    
  35.         passwordSQL = JiveGlobals.getProperty("jdbcAuthProvider.passwordSQL");    
  36.         setPasswordSQL = JiveGlobals.getProperty("jdbcAuthProvider.setPasswordSQL");    
  37.     
  38.         allowUpdate = JiveGlobals.getBooleanProperty("jdbcAuthProvider.allowUpdate",false);    
  39.     
  40.         passwordType = PasswordType.plain;    
  41.         try {    
  42.             passwordType = PasswordType.valueOf(    
  43.                     JiveGlobals.getProperty("jdbcAuthProvider.passwordType""plain"));    
  44.             Log.error("PasswordType:"+ passwordType);    
  45.         }    
  46.         catch (IllegalArgumentException iae) {    
  47.             Log.error(iae);    
  48.         }    
  49.     }    

3 楼 lookdd1 2010-03-30  
请问,整合现有数据库为oracle的时候如何写这个jdbcProvider.connectionString啊?用户名和密码写在什么地方?jdbc:oracle:thin:@[HOST]:1521:[INSTANCE]?name=?&password=?
2 楼 hetylei 2009-06-30  
key232323 写道
请问一个问题,当我修改
org.jivesoftware.openfire.user.JDBCUserProvider
org.jivesoftware.openfire.auth.JDBCAuthProvider

后,admin就无法登陆了

出现UnauthorizedException
结果调用了
LoginLimitManager.recordFailedAttempt

一直处于登陆页面
请问为什么出现此原因?

最后 还需要配置新的管理员用户 
admin.authorizedJIDs 
*指定新数据源中的管理员用户注意是是完整JID(user@域名) 
*例:admin@server.cn 


以上设置登录用户名是admin
1 楼 key232323 2009-06-27  
请问一个问题,当我修改
org.jivesoftware.openfire.user.JDBCUserProvider
org.jivesoftware.openfire.auth.JDBCAuthProvider

后,admin就无法登陆了

出现UnauthorizedException
结果调用了
LoginLimitManager.recordFailedAttempt

一直处于登陆页面
请问为什么出现此原因?

本文转载:CSDN博客