您的位置:首页 > 数据库

openfire用户以及群组关系移植(与数据库中的关联)

2014-01-08 15:24 621 查看

openfire用户以及群组关系移植

时间 2013-08-01 12:02:00 BlogJava-专家区
原文 http://www.blogjava.net/liuguly/archive/2013/08/01/402251.html

修改openfire的配置有两种途径:

1:修改安装目录/conf/openfire.xml。

2:直接修改openfire数据库的ofProperty表。

但是一般都建议修改openfire.xml文件,该文件如果配置正确,openfire重启后会自动将该文件里的属性值写入ofProperty表,同时会擦除自己添加的配置,只剩标签(除了默认配置)。如图:



对应ofProperty表配置:



官网提供的说明,自己在进行移植的时候有几点需要注意(以下都在openfire.xml里面配置)

1:官网提供的关于自己用户以及群所在的数据库配置:
< jive
>   


< jdbcProvider
>      <
driver >
com.mysql.jdbc.Driver </
driver >     
< connectionString
> jdbc:mysql:
// localhost/dbname?user=username&password=secret</connectionString>
  
</ jdbcProvider
>   


</ jive
>
里面的用户名和密码之间要加入&不能忘记,同时配置成功后,在ofProperty表里面会还原成&,不要在表里面修改为&
2:官网提供的关于用户登陆的配置以及admin的配置:

< jive
>   


     < admin
>         
< authorizedUsernames
> joe, jane
</ authorizedUsernames
>      </
admin >
   < provider
>      <
auth >
       < className
> org.jivesoftware.openfire.auth.JDBCAuthProvider
</ className
>      </
auth >
   </ provider
>    <
jdbcAuthProvider >
      <
passwordSQL >
SELECT password FROM user_account WHERE username
=?</ passwordSQL
>       <
passwordType >
plain </
passwordType >
    </ jdbcAuthProvider
>    


</ jive
>
注意点:这个时候网页登陆的用户已经不再是openfire自带的ofUser表里面的用户,而是user_account表的用户,该表就是自己的用户表,这里注意一点:
不要在select password后面再添加字段。
3:官网提供的用户配置:

< jive
>   


   < provider
>      <
auth >
       < className
> org.jivesoftware.openfire.auth.JDBCAuthProvider
</ className
>      </
auth >
     < user
>        <
className >
org.jivesoftware.openfire.user.JDBCUserProvider
</ className
>      </
user >
   <
4000
/span></ provider
>    <
jdbcAuthProvider >
      <
passwordSQL >
SELECT password FROM user_account WHERE username
=?</ passwordSQL
>       <
passwordType >
plain </
passwordType >
   </ jdbcAuthProvider
>    <
jdbcUserProvider >
      <
loadUserSQL >
SELECT name,email FROM myUser WHERE username =?</
loadUserSQL >
      <
userCountSQL >
SELECT COUNT( *
) FROM myUser </
userCountSQL >
      < allUsersSQL
> SELECT username FROM myUser
</ allUsersSQL
>       <
searchSQL >
SELECT username FROM myUser WHERE
</ searchSQL
>       <
usernameField >
username </
usernameField >
      <
nameField >
name </ nameField
>       <
emailField >
email </
emailField >
   </ jdbcUserProvider
>    


  </ jive
>
注意点:select后面的字段不要随意添加,比如<loadUserSQL>SELECT name,email FROM myUser WHERE username=?</loadUserSQL>
我测试的时候去掉email,只查询name,结果用户总是无法登陆网页,查看了op源码在JDBCUserProvider类里有下面这一段:

 1       
public  User loadUser(String username) 
throws  UserNotFoundException {

 2           
if (username.contains(
" @
" )) {
 3               
if  (
! XMPPServer.getInstance().isLocal(
new  JID(username))) {
 4                   
throw  
new  UserNotFoundException(
" Cannot load user of remote server: 
"   +
 username);
 5               }

 6               username 
=  username.substring(
0 ,username.lastIndexOf(
" @
" ));
 7           }

 8           Connection con 
=  
null ;
 9           PreparedStatement pstmt 
=  
null ;
10           ResultSet rs 
=  
null ;
11           
try  {
12               con 
=  getConnection();

13               pstmt 
=  con.prepareStatement(loadUserSQL);

14               pstmt.setString(
1 , username);
15               rs 
=  pstmt.executeQuery();

16               
if  (
! rs.next()) {
17                   
throw  
new  UserNotFoundException();
18               }

19               String name 
=  rs.getString(
1 );
20               String email 
=  rs.getString(
2 );
21   22  
             return
  new
 User(username, name, email,  new
 Date(),  new
 Date());
23           }

24           
catch  (Exception e) {

25               
throw  
new  UserNotFoundException(e);
26           }

27           
finally  {
28               DbConnectionManager.closeConnection(rs, pstmt, con);

29           }

30       }

代码走到20行的时候报错,因为查询sql不包括email,结果集里面并无email字段,所以rs.getString(2)的时候出错了。
所以根据经验不要轻易增减select后面的字段,如果没有select后面的字段,只有两种办法一个是修改op源码,一个是修改自己的业务表,增加op查询时候需要的字段。
4:官网提供的单用户以及群组配置:

< jive
>   


   < provider
>      <
auth >
       < className
> org.jivesoftware.openfire.auth.JDBCAuthProvider
</ className
>      </
auth >
     < user
>        <
className >
org.jivesoftware.openfire.user.JDBCUserProvider
</ className
>      </
user >
     < group
>        <
className >
org.jivesoftware.openfire.group.JDBCGroupProvider
</ className
>      </
group >
   </ provider
>    <
jdbcAuthProvider >
      <
passwordSQL >
SELECT password F
b4b3
ROM user_account WHERE username
=?</ passwordSQL
>       <
passwordType >
plain </
passwordType >
   </ jdbcAuthProvider
>    <
jdbcUserProvider >
      <
loadUserSQL >
SELECT name,email FROM myUser WHERE username =?</
loadUserSQL >
      <
userCountSQL >
SELECT COUNT( *
) FROM myUser </
userCountSQL >
      < allUsersSQL
> SELECT username FROM myUser
</ allUsersSQL
>       <
searchSQL >
SELECT username FROM myUser WHERE
</ searchSQL
>       <
usernameField >
username </
usernameField >
      <
nameField >
name </ nameField
>       <
emailField >
email </
emailField >
   </ jdbcUserProvider
>    <
jdbcGroupProvider
>         <
groupCountSQL >
SELECT count( *
) FROM myGroups </
groupCountSQL >
        <
allGroupsSQL >
SELECT groupName FROM myGroups </
allGroupsSQL >
        < userGroupsSQL
> SELECT groupName FROM myGroupUsers WHERE username
=?</ userGroupsSQL
>         <
descriptionSQL >
SELECT groupDescription FROM myGroups WHERE groupName
=?</ descriptionSQL
>         <
loadMembersSQL >
SELECT username FROM myGroupUsers WHERE groupName
=?  AND isAdmin
= '
N ' </
loadMembersSQL >
        <
loadAdminsSQL >
SELECT username FROM myGroupUsers WHERE groupName
=?  AND isAdmin
= ' Y
' </
loadAdminsSQL >
   </ jdbcGroupProvider
>   


</ jive
>
注意点:不要轻易增删select后面的字段,根据自己的业务表进行修改即可。写sql的时候一定要注意是否正确,只要有一点出错网页就无法显示出你自己的用户以及群组。
当出现不明错误的时候,进入logs目录查看error.log进行调整测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐