zoukankan      html  css  js  c++  java
  • xmpp with openfire 之四 扩展AuthProvider

    上一篇中提到jdbcAuthProvider.passwordType提供了三种方式

    如果你的密码加密规则不是这三种方式,可以自己进行扩充

    首先,下载openfire的源码
    http://www.igniterealtime.org/downloads/source.jsp

    打开org.jivesoftware.openfire.auth.JDBCAuthProvider
    Java代码 复制代码
    1. package org.jivesoftware.openfire.auth;   
    2.   
    3. import org.jivesoftware.database.DbConnectionManager;   
    4. import org.jivesoftware.openfire.XMPPServer;   
    5. import org.jivesoftware.openfire.user.UserAlreadyExistsException;   
    6. import org.jivesoftware.openfire.user.UserManager;   
    7. import org.jivesoftware.openfire.user.UserNotFoundException;   
    8. import org.jivesoftware.util.JiveGlobals;   
    9. import org.jivesoftware.util.Log;   
    10. import org.jivesoftware.util.StringUtils;   
    11.   
    12. import java.sql.*;   
    13.   
    14. /**  
    15.  * The JDBC auth provider allows you to authenticate users against any database  
    16.  * that you can connect to with JDBC. It can be used along with the  
    17.  * {@link HybridAuthProvider hybrid} auth provider, so that you can also have  
    18.  * XMPP-only users that won't pollute your external data.<p>  
    19.  *  
    20.  * To enable this provider, set the following in the system properties:  
    21.  * <ul>  
    22.  * <li><tt>provider.auth.className = org.jivesoftware.openfire.auth.JDBCAuthProvider</tt></li>  
    23.  * </ul>  
    24.  *  
    25.  * You'll also need to set your JDBC driver, connection string, and SQL statements:  
    26.  *  
    27.  * <ul>  
    28.  * <li><tt>jdbcProvider.driver = com.mysql.jdbc.Driver</tt></li>  
    29.  * <li><tt>jdbcProvider.connectionString = jdbc:mysql://localhost/dbname?user=username&amp;password=secret</tt></li>  
    30.  * <li><tt>jdbcAuthProvider.passwordSQL = SELECT password FROM user_account WHERE username=?</tt></li>  
    31.  * <li><tt>jdbcAuthProvider.passwordType = plain</tt></li>  
    32.  * <li><tt>jdbcAuthProvider.allowUpdate = true</tt></li>  
    33.  * <li><tt>jdbcAuthProvider.setPasswordSQL = UPDATE user_account SET password=? WHERE username=?</tt></li>  
    34.  * </ul>  
    35.  *  
    36.  * The passwordType setting tells Openfire how the password is stored. Setting the value  
    37.  * is optional (when not set, it defaults to "plain"). The valid values are:<ul>  
    38.  *      <li>{@link PasswordType#plain plain}  
    39.  *      <li>{@link PasswordType#md5 md5}  
    40.  *      <li>{@link PasswordType#sha1 sha1}  
    41.  *  </ul>  
    42.  *  
    43.  * @author David Snopek  
    44.  */  
    45. public class JDBCAuthProvider implements AuthProvider {   
    46.   
    47.     private String connectionString;   
    48.   
    49.     private String passwordSQL;   
    50.     private String setPasswordSQL;   
    51.     private PasswordType passwordType;   
    52.     private boolean allowUpdate;   
    53.   
    54.     /**  
    55.      * Constructs a new JDBC authentication provider.  
    56.      */  
    57.     public JDBCAuthProvider() {   
    58.         // Convert XML based provider setup to Database based   
    59.         JiveGlobals.migrateProperty("jdbcProvider.driver");   
    60.         JiveGlobals.migrateProperty("jdbcProvider.connectionString");   
    61.         JiveGlobals.migrateProperty("jdbcAuthProvider.passwordSQL");   
    62.         JiveGlobals.migrateProperty("jdbcAuthProvider.passwordType");   
    63.         JiveGlobals.migrateProperty("jdbcAuthProvider.setPasswordSQL");   
    64.         JiveGlobals.migrateProperty("jdbcAuthProvider.allowUpdate");   
    65.   
    66.         // Load the JDBC driver and connection string.   
    67.         String jdbcDriver = JiveGlobals.getProperty("jdbcProvider.driver");   
    68.         try {   
    69.             Class.forName(jdbcDriver).newInstance();   
    70.         }   
    71.         catch (Exception e) {   
    72.             Log.error("Unable to load JDBC driver: " + jdbcDriver, e);   
    73.             return;   
    74.         }   
    75.         connectionString = JiveGlobals.getProperty("jdbcProvider.connectionString");   
    76.   
    77.         // Load SQL statements.   
    78.         passwordSQL = JiveGlobals.getProperty("jdbcAuthProvider.passwordSQL");   
    79.         setPasswordSQL = JiveGlobals.getProperty("jdbcAuthProvider.setPasswordSQL");   
    80.   
    81.         allowUpdate = JiveGlobals.getBooleanProperty("jdbcAuthProvider.allowUpdate",false);   
    82.   
    83.         passwordType = PasswordType.plain;   
    84.         try {   
    85.             passwordType = PasswordType.valueOf(   
    86.                     JiveGlobals.getProperty("jdbcAuthProvider.passwordType""plain"));   
    87.         }   
    88.         catch (IllegalArgumentException iae) {   
    89.             Log.error(iae);   
    90.         }   
    91.     }   
    92.   
    93.     public void authenticate(String username, String password) throws UnauthorizedException {   
    94.         if (username == null || password == null) {   
    95.             throw new UnauthorizedException();   
    96.         }   
    97.         username = username.trim().toLowerCase();   
    98.         if (username.contains("@")) {   
    99.             // Check that the specified domain matches the server's domain   
    100.             int index = username.indexOf("@");   
    101.             String domain = username.substring(index + 1);   
    102.             if (domain.equals(XMPPServer.getInstance().getServerInfo().getXMPPDomain())) {   
    103.                 username = username.substring(0, index);   
    104.             } else {   
    105.                 // Unknown domain. Return authentication failed.   
    106.                 throw new UnauthorizedException();   
    107.             }   
    108.         }   
    109.         String userPassword;   
    110.         try {   
    111.             userPassword = getPasswordValue(username);   
    112.         }   
    113.         catch (UserNotFoundException unfe) {   
    114.             throw new UnauthorizedException();   
    115.         }   
    116.         // If the user's password doesn't match the password passed in, authentication   
    117.         // should fail.   
    118.         if (passwordType == PasswordType.md5) {   
    119.             password = StringUtils.hash(password, "MD5");   
    120.         }   
    121.         else if (passwordType == PasswordType.sha1) {   
    122.             password = StringUtils.hash(password, "SHA-1");   
    123.         }   
    124.         if (!password.equals(userPassword)) {   
    125.             throw new UnauthorizedException();   
    126.         }   
    127.   
    128.         // Got this far, so the user must be authorized.   
    129.         createUser(username);   
    130.     }   
    131.   
    132.     public void authenticate(String username, String token, String digest)   
    133.             throws UnauthorizedException   
    134.     {   
    135.         if (passwordType != PasswordType.plain) {   
    136.             throw new UnsupportedOperationException("Digest authentication not supported for "  
    137.                     + "password type " + passwordType);   
    138.         }   
    139.         if (username == null || token == null || digest == null) {   
    140.             throw new UnauthorizedException();   
    141.         }   
    142.         username = username.trim().toLowerCase();   
    143.         if (username.contains("@")) {   
    144.             // Check that the specified domain matches the server's domain   
    145.             int index = username.indexOf("@");   
    146.             String domain = username.substring(index + 1);   
    147.             if (domain.equals(XMPPServer.getInstance().getServerInfo().getXMPPDomain())) {   
    148.                 username = username.substring(0, index);   
    149.             } else {   
    150.                 // Unknown domain. Return authentication failed.   
    151.                 throw new UnauthorizedException();   
    152.             }   
    153.         }   
    154.         String password;   
    155.         try {   
    156.             password = getPasswordValue(username);   
    157.         }   
    158.         catch (UserNotFoundException unfe) {   
    159.             throw new UnauthorizedException();   
    160.         }   
    161.         String anticipatedDigest = AuthFactory.createDigest(token, password);   
    162.         if (!digest.equalsIgnoreCase(anticipatedDigest)) {   
    163.             throw new UnauthorizedException();   
    164.         }   
    165.   
    166.         // Got this far, so the user must be authorized.   
    167.         createUser(username);   
    168.     }   
    169.   
    170.     public boolean isPlainSupported() {   
    171.         // If the auth SQL is defined, plain text authentication is supported.   
    172.         return (passwordSQL != null);   
    173.     }   
    174.   
    175.     public boolean isDigestSupported() {   
    176.         // The auth SQL must be defined and the password type is supported.   
    177.         return (passwordSQL != null && passwordType == PasswordType.plain);   
    178.     }   
    179.   
    180.     public String getPassword(String username) throws UserNotFoundException,   
    181.             UnsupportedOperationException   
    182.     {   
    183.   
    184.         if (!supportsPasswordRetrieval()) {   
    185.             throw new UnsupportedOperationException();   
    186.         }   
    187.         if (username.contains("@")) {   
    188.             // Check that the specified domain matches the server's domain   
    189.             int index = username.indexOf("@");   
    190.             String domain = username.substring(index + 1);   
    191.             if (domain.equals(XMPPServer.getInstance().getServerInfo().getXMPPDomain())) {   
    192.                 username = username.substring(0, index);   
    193.             } else {   
    194.                 // Unknown domain.   
    195.                 throw new UserNotFoundException();   
    196.             }   
    197.         }   
    198.         return getPasswordValue(username);   
    199.     }   
    200.   
    201.     public void setPassword(String username, String password)   
    202.             throws UserNotFoundException, UnsupportedOperationException   
    203.     {   
    204.         if (allowUpdate && setPasswordSQL != null) {   
    205.             setPasswordValue(username, password);   
    206.         } else {    
    207.             throw new UnsupportedOperationException();   
    208.         }   
    209.     }   
    210.   
    211.     public boolean supportsPasswordRetrieval() {   
    212.         return (passwordSQL != null && passwordType == PasswordType.plain);   
    213.     }   
    214.   
    215.     /**  
    216.      * Returns the value of the password field. It will be in plain text or hashed  
    217.      * format, depending on the password type.  
    218.      *  
    219.      * @param username user to retrieve the password field for  
    220.      * @return the password value.  
    221.      * @throws UserNotFoundException if the given user could not be loaded.  
    222.      */  
    223.     private String getPasswordValue(String username) throws UserNotFoundException {   
    224.         String password = null;   
    225.         Connection con = null;   
    226.         PreparedStatement pstmt = null;   
    227.         ResultSet rs = null;   
    228.         if (username.contains("@")) {   
    229.             // Check that the specified domain matches the server's domain   
    230.             int index = username.indexOf("@");   
    231.             String domain = username.substring(index + 1);   
    232.             if (domain.equals(XMPPServer.getInstance().getServerInfo().getXMPPDomain())) {   
    233.                 username = username.substring(0, index);   
    234.             } else {   
    235.                 // Unknown domain.   
    236.                 throw new UserNotFoundException();   
    237.             }   
    238.         }   
    239.         try {   
    240.             con = DriverManager.getConnection(connectionString);   
    241.             pstmt = con.prepareStatement(passwordSQL);   
    242.             pstmt.setString(1, username);   
    243.   
    244.             rs = pstmt.executeQuery();   
    245.   
    246.             // If the query had no results, the username and password   
    247.             // did not match a user record. Therefore, throw an exception.   
    248.             if (!rs.next()) {   
    249.                 throw new UserNotFoundException();   
    250.             }   
    251.             password = rs.getString(1);   
    252.         }   
    253.         catch (SQLException e) {   
    254.             Log.error("Exception in JDBCAuthProvider", e);   
    255.             throw new UserNotFoundException();   
    256.         }   
    257.         finally {   
    258.             DbConnectionManager.closeConnection(rs, pstmt, con);   
    259.         }   
    260.         return password;   
    261.     }   
    262.   
    263.     private void setPasswordValue(String username, String password) throws UserNotFoundException {   
    264.         Connection con = null;   
    265.         PreparedStatement pstmt = null;   
    266.         ResultSet rs = null;   
    267.         if (username.contains("@")) {   
    268.             // Check that the specified domain matches the server's domain   
    269.             int index = username.indexOf("@");   
    270.             String domain = username.substring(index + 1);   
    271.             if (domain.equals(XMPPServer.getInstance().getServerInfo().getXMPPDomain())) {   
    272.                 username = username.substring(0, index);   
    273.             } else {   
    274.                 // Unknown domain.   
    275.                 throw new UserNotFoundException();   
    276.             }   
    277.         }   
    278.         try {   
    279.             con = DriverManager.getConnection(connectionString);   
    280.             pstmt = con.prepareStatement(setPasswordSQL);   
    281.             pstmt.setString(1, username);   
    282.             if (passwordType == PasswordType.md5) {   
    283.                 password = StringUtils.hash(password, "MD5");   
    284.             }   
    285.             else if (passwordType == PasswordType.sha1) {   
    286.                 password = StringUtils.hash(password, "SHA-1");   
    287.             }   
    288.             pstmt.setString(2, password);   
    289.   
    290.             rs = pstmt.executeQuery();   
    291.   
    292.         }   
    293.         catch (SQLException e) {   
    294.             Log.error("Exception in JDBCAuthProvider", e);   
    295.             throw new UserNotFoundException();   
    296.         }   
    297.         finally {   
    298.             DbConnectionManager.closeConnection(rs, pstmt, con);   
    299.         }   
    300.            
    301.     }   
    302.   
    303.     /**  
    304.      * Indicates how the password is stored.  
    305.      */  
    306.     @SuppressWarnings({"UnnecessarySemicolon"})  // Support for QDox Parser   
    307.     public enum PasswordType {   
    308.   
    309.         /**  
    310.          * The password is stored as plain text.  
    311.          */  
    312.         plain,   
    313.   
    314.         /**  
    315.          * The password is stored as a hex-encoded MD5 hash.  
    316.          */  
    317.         md5,   
    318.   
    319.         /**  
    320.          * The password is stored as a hex-encoded SHA-1 hash.  
    321.          */  
    322.         sha1;   
    323.     }   
    324.   
    325.     /**  
    326.      * Checks to see if the user exists; if not, a new user is created.  
    327.      *  
    328.      * @param username the username.  
    329.      */  
    330.     private static void createUser(String username) {   
    331.         // See if the user exists in the database. If not, automatically create them.   
    332.         UserManager userManager = UserManager.getInstance();   
    333.         try {   
    334.             userManager.getUser(username);   
    335.         }   
    336.         catch (UserNotFoundException unfe) {   
    337.             try {   
    338.                 Log.debug("JDBCAuthProvider: Automatically creating new user account for " + username);   
    339.                 UserManager.getUserProvider().createUser(username, StringUtils.randomString(8),   
    340.                         nullnull);   
    341.             }   
    342.             catch (UserAlreadyExistsException uaee) {   
    343.                 // Ignore.   
    344.             }   
    345.         }   
    346.     }   
    347. }  


    看以看到通过读取PASSWORDTYPE配置
    Java代码 复制代码
    1. JiveGlobals.migrateProperty("jdbcAuthProvider.passwordType");   
    2. 。。。。。   
    3. 。。。。。   
    4. 。。。。。   
    5. passwordType = PasswordType.plain;     
    6.         try {     
    7.             passwordType = PasswordType.valueOf(     
    8.                     JiveGlobals.getProperty("jdbcAuthProvider.passwordType""plain"));     
    9.         }     
    10.         catch (IllegalArgumentException iae) {     
    11.             Log.error(iae);     
    12.         }    

    进行密码的验证
    Java代码 复制代码
    1. if (passwordType == PasswordType.md5) {   
    2.            password = StringUtils.hash(password, "MD5");   
    3.        }   
    4.        else if (passwordType == PasswordType.sha1) {   
    5.            password = StringUtils.hash(password, "SHA-1");   
    6.        }   
    7.        if (!password.equals(userPassword)) {   
    8.            throw new UnauthorizedException();   
    9.        }  



    这样完全可以仿照JDBCAuthProvider重新构造

    Java代码 复制代码
    1. package org.yxsoft.openfire.plugin;   
    2.   
    3.   
    4. import org.jivesoftware.openfire.user.UserNotFoundException;   
    5. import org.jivesoftware.openfire.auth.*;   
    6. import org.jivesoftware.openfire.XMPPServer;   
    7. import org.jivesoftware.util.JiveGlobals;   
    8. import org.jivesoftware.util.Log;   
    9. import org.jivesoftware.util.StringUtils;   
    10. import org.jivesoftware.database.DbConnectionManager;   
    11.   
    12. import java.sql.*;   
    13. import java.security.MessageDigest;   
    14.   
    15. /**  
    16.  * Created by cl  
    17.  * Date: 2008-9-4  
    18.  * Time: 9:18:26  
    19.  * 仿照JDBCAuthProvider  
    20.  * 在数据库连接上 支持user/password  
    21.  * 密码验证 使用bfmp的机制  
    22.  */  
    23. public class BfmpAuthProvider implements AuthProvider {   
    24.     private String connectionString;   
    25.     private String user;   
    26.     private String password;   
    27.   
    28.     private String passwordSQL;   
    29.     private String setPasswordSQL;   
    30.     private PasswordType passwordType;   
    31.     private boolean allowUpdate;   
    32.   
    33.     /**  
    34.      * 初始化  
    35.      * 比JDBCAuthProvider多支持  
    36.      * JiveGlobals.migrateProperty("jdbcProvider.url");  
    37.         JiveGlobals.migrateProperty("jdbcProvider.user");  
    38.         JiveGlobals.migrateProperty("jdbcProvider.password");  
    39.      */  
    40.     public BfmpAuthProvider() {   
    41.         // Convert XML based provider setup to Database based   
    42.         JiveGlobals.migrateProperty("jdbcProvider.driver");   
    43.         JiveGlobals.migrateProperty("jdbcProvider.url");   
    44.         JiveGlobals.migrateProperty("jdbcProvider.user");   
    45.         JiveGlobals.migrateProperty("jdbcProvider.password");   
    46.   
    47.         JiveGlobals.migrateProperty("jdbcAuthProvider.passwordSQL");   
    48.         JiveGlobals.migrateProperty("jdbcAuthProvider.passwordType");   
    49.         JiveGlobals.migrateProperty("jdbcAuthProvider.setPasswordSQL");   
    50.         JiveGlobals.migrateProperty("jdbcAuthProvider.allowUpdate");   
    51.         JiveGlobals.migrateProperty("jdbcAuthProvider.passwordType");   
    52.   
    53.         // Load the JDBC driver and connection string.   
    54.         String jdbcDriver = JiveGlobals.getProperty("jdbcProvider.driver");   
    55.         try {   
    56.             Class.forName(jdbcDriver).newInstance();   
    57.         }   
    58.         catch (Exception e) {   
    59.             Log.error("Unable to load JDBC driver: " + jdbcDriver, e);   
    60.             return;   
    61.         }   
    62.         connectionString = JiveGlobals.getProperty("jdbcProvider.url");   
    63.         user = JiveGlobals.getProperty("jdbcProvider.user");   
    64.         password = JiveGlobals.getProperty("jdbcProvider.password");   
    65.   
    66.         // Load SQL statements.   
    67.         passwordSQL = JiveGlobals.getProperty("jdbcAuthProvider.passwordSQL");   
    68.         setPasswordSQL = JiveGlobals.getProperty("jdbcAuthProvider.setPasswordSQL");   
    69.   
    70.         allowUpdate = JiveGlobals.getBooleanProperty("jdbcAuthProvider.allowUpdate",false);   
    71.   
    72.         passwordType = PasswordType.plain;   
    73.         try {   
    74.             passwordType = PasswordType.valueOf(   
    75.                     JiveGlobals.getProperty("jdbcAuthProvider.passwordType""plain"));   
    76.             Log.error("PasswordType:"+ passwordType);   
    77.         }   
    78.         catch (IllegalArgumentException iae) {   
    79.             Log.error(iae);   
    80.         }   
    81.     }   
    82.   
    83.     public boolean isPlainSupported() {   
    84.         //default   
    85.         return true;   
    86.     }   
    87.   
    88.     public boolean isDigestSupported() {   
    89.         //default   
    90.         return true;   
    91.     }   
    92.   
    93.     public void authenticate(String username, String password) throws UnauthorizedException, ConnectionException, InternalUnauthenticatedException {   
    94.         if (username == null || password == null) {   
    95.             throw new UnauthorizedException();   
    96.         }   
    97.         Log.error(username+":"+password);   
    98.         username = username.trim().toLowerCase();   
    99.         if (username.contains("@")) {   
    100.             Log.error(username+":"+XMPPServer.getInstance().getServerInfo().getXMPPDomain());   
    101.             // Check that the specified domain matches the server's domain   
    102.             int index = username.indexOf("@");   
    103.             String domain = username.substring(index + 1);   
    104.             if (domain.equals(XMPPServer.getInstance().getServerInfo().getXMPPDomain())) {   
    105.                 username = username.substring(0, index);   
    106.             } else {   
    107.                 // Unknown domain. Return authentication failed.   
    108.                 throw new UnauthorizedException();   
    109.             }   
    110.         } else {   
    111.             Log.error("user name not contains ");   
    112.         }   
    113.         String userPassword;   
    114.         try {   
    115.             userPassword = getPasswordValue(username);   
    116.         }   
    117.         catch (UserNotFoundException unfe) {   
    118.             throw new UnauthorizedException();   
    119.         }   
    120.         // If the user's password doesn't match the password passed in, authentication   
    121.         // should fail.   
    122.         if (passwordType == PasswordType.bfmp) {   
    123.             //这里BfmpMD5 就是自己的密码规则   
    124.             password = BfmpMD5(password);   
    125.         }   
    126.   
    127.         if (!password.equals(userPassword)) {   
    128.             throw new UnauthorizedException();   
    129.         }   
    130.   
    131.         // Got this far, so the user must be authorized.   
    132.         //createUser(username);   
    133.     }   
    134.   
    135.     public void authenticate(String username, String token, String digest) throws UnauthorizedException, ConnectionException, InternalUnauthenticatedException {   
    136.         if (passwordType != PasswordType.plain) {   
    137.             throw new UnsupportedOperationException("Digest authentication not supported for "  
    138.                     + "password type " + passwordType);   
    139.         }   
    140.         if (username == null || token == null || digest == null) {   
    141.             throw new UnauthorizedException();   
    142.         }   
    143.         username = username.trim().toLowerCase();   
    144.         if (username.contains("@")) {   
    145.             // Check that the specified domain matches the server's domain   
    146.             int index = username.indexOf("@");   
    147.             String domain = username.substring(index + 1);   
    148.             if (domain.equals(XMPPServer.getInstance().getServerInfo().getXMPPDomain())) {   
    149.                 username = username.substring(0, index);   
    150.             } else {   
    151.                 // Unknown domain. Return authentication failed.   
    152.                 throw new UnauthorizedException();   
    153.             }   
    154.         }   
    155.         String password;   
    156.         try {   
    157.             password = getPasswordValue(username);   
    158.         }   
    159.         catch (UserNotFoundException unfe) {   
    160.             throw new UnauthorizedException();   
    161.         }   
    162.         String anticipatedDigest = AuthFactory.createDigest(token, password);   
    163.         if (!digest.equalsIgnoreCase(anticipatedDigest)) {   
    164.             throw new UnauthorizedException();   
    165.         }   
    166.   
    167.         // Got this far, so the user must be authorized.   
    168.         //createUser(username);   
    169.     }   
    170.   
    171.     public String getPassword(String username) throws UserNotFoundException, UnsupportedOperationException {   
    172.         if (!supportsPasswordRetrieval()) {   
    173.             throw new UnsupportedOperationException();   
    174.         }   
    175.         if (username.contains("@")) {   
    176.             // Check that the specified domain matches the server's domain   
    177.             int index = username.indexOf("@");   
    178.             String domain = username.substring(index + 1);   
    179.             if (domain.equals(XMPPServer.getInstance().getServerInfo().getXMPPDomain())) {   
    180.                 username = username.substring(0, index);   
    181.             } else {   
    182.                 // Unknown domain.   
    183.                 throw new UserNotFoundException();   
    184.             }   
    185.         }   
    186.         return getPasswordValue(username);   
    187.     }   
    188.   
    189.     private String getPasswordValue(String username) throws UserNotFoundException {   
    190.         String password = null;   
    191.         Connection con = null;   
    192.         PreparedStatement pstmt = null;   
    193.         ResultSet rs = null;   
    194.         if (username.contains("@")) {   
    195.             // Check that the specified domain matches the server's domain   
    196.             int index = username.indexOf("@");   
    197.             String domain = username.substring(index + 1);   
    198.             if (domain.equals(XMPPServer.getInstance().getServerInfo().getXMPPDomain())) {   
    199.                 username = username.substring(0, index);   
    200.             } else {   
    201.                 // Unknown domain.   
    202.                 throw new UserNotFoundException();   
    203.             }   
    204.         }   
    205.         try {   
    206.             con = DriverManager.getConnection(connectionString, user, this.password);   
    207.             pstmt = con.prepareStatement(passwordSQL);   
    208.             pstmt.setString(1, username);   
    209.   
    210.             rs = pstmt.executeQuery();   
    211.   
    212.             // If the query had no results, the username and password   
    213.             // did not match a user record. Therefore, throw an exception.   
    214.             if (!rs.next()) {   
    215.                 throw new UserNotFoundException();   
    216.             }   
    217.             password = rs.getString(1);   
    218.         }   
    219.         catch (SQLException e) {   
    220.             Log.error("Exception in JDBCAuthProvider", e);   
    221.             throw new UserNotFoundException();   
    222.         }   
    223.         finally {   
    224.             DbConnectionManager.closeConnection(rs, pstmt, con);   
    225.         }   
    226.         return password;   
    227.     }   
    228.   
    229.     public void setPassword(String username, String password) throws UserNotFoundException, UnsupportedOperationException {   
    230.         // unsupport   
    231.     }   
    232.   
    233.     public boolean supportsPasswordRetrieval() {   
    234.         return true;   
    235.     }   
    236.   
    237.   
    238.     /**  
    239.      * Indicates how the password is stored.  
    240.      */  
    241.     @SuppressWarnings({"UnnecessarySemicolon"})  // Support for QDox Parser   
    242.     public enum PasswordType {   
    243.   
    244.         /**  
    245.          * The password is stored as plain text.  
    246.          */  
    247.         plain,   
    248.   
    249.         /**  
    250.          * The password is stored as a bfmp passwrod.  
    251.          */  
    252.         bfmp;   
    253.     }   
    254.   
    255.     private String BfmpMD5 (String source) {   
    256.         //在这里实现你的加密机制,返回生成的密码   
    257.         return "";   
    258.   
    259.     }   
    260.   
    261.   
    262. }  




    编译后将此class加入到lib/openfire.jar中即可

    当然不要忘记 将系统属性中
    provider.auth.className,改成你自已的Provider
    *上述代码例子中是org.yxsoft.openfire.plugin.BFMPAuthProvider
    jdbcAuthProvider.passwordType,改成你自己定义的枚举值
    *上述代码例子中是bfmp
  • 相关阅读:
    超过经理收入的员工
    搜索插入位置
    整数反转
    俩数之和
    tar 命令参数解释
    【记录】Transaction rolled back because it has been marked as rollback-only
    【转载】BIO、NIO、AIO
    【转载】JDK自带的log工具
    【转载】java8中的Calendar日期对象(LocalDateTime)
    【对象属性复制】BeanUtils.copyProperties(obj1, obj2);
  • 原文地址:https://www.cnblogs.com/hannover/p/1353809.html
Copyright © 2011-2022 走看看