最近一周,应俱乐部技术大牛的邀请,研究了一下 WordPress 用户数据与 LDAP 服务器用户数据的关联。
话说我 PHP 还停留在去年写出第一个 PHP 脚本的水平,也不了解 LDAP 到底是怎么回事,对 WordPress 的函数什么的也都不甚了解,于是一周进度相当慢。
今天又看了一下文档,突然觉得脑袋有点清晰了,理了一下思路,写了个插件。不过很明显 bug 多多,希望各位走过路过能够给点意见,指正我的错误。
这个插件是要求 WordPress 开启多站点功能的,没开启的用起来是什么样,我还真不知道。而且由于本人折腾半天没有弄好 LDAP 服务器,于是乎只好先用 MySql 服务器替代,后面只要换掉应该就好了。
具体的功能是:另一台服务器上有一套用户数据(其他应用的,比如 UCenter 之类的,在我的插件里默认另一个应用也是 WordPress),当 WordPress 用户登陆时,数据库中没有此用户的数据,则从另一台服务器获取数据,然后在 WordPress 里建立相应的用户和站点。
假设 WordPress 数据库是 WP ,另一套用户数据存放在 WordPress 数据库中。并且假设另一 WordPress 数据库中用户密码未经加密。
这个插件有个比较大的 bug ,就是只有在总站登陆时才会自动建立,但是从二级博客登陆时就显示登录失败,具体什么原因还不知道。当然小 bug 还有很多吧,细节我都没有处理,比如数据库连接失败啊什么的。
发上来拙作,欢迎围观我一下午现学现卖的成果。
<?php
/*
* Plugin Name: LADP USER AUTH
* Plugin URI: http://piovano.net/
* Version: 0.1
* Author: WJNAN
* Description: Just For Test
*/
//由于没有LADP服务器可用 暂时使用MySQL服务器替代
require_once(ABSPATH . WPINC . '/registration.php');
//定义变量
//LADP服务器信息
$ladpserver = "127.0.0.1";
$ladpusername = "test";
$ladppassword = "test";
//站点信息
$domain = "";
$title = "";
$email = "";
//重定义WordPress用户认证函数
if ( !function_exists('wp_authenticate') ) {
function wp_authenticate($username, $password) {
$username = sanitize_user($username);
$password = trim($password);
$user = apply_filters('authenticate', null, $username, $password);
if ( $user == null ) {
// TODO what should the error message be? (Or would these even happen?)
// Only needed if all authentication handlers fail to return anything.
$user = new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid username or incorrect password.'));
}
$ignore_codes = array('empty_username', 'empty_password');
if (is_wp_error($user) && !in_array($user->get_error_code(), $ignore_codes) ) {
//登录失败时 连接LDAP服务器 验证用户信息
if (ladp_authenticate( $username, $password )) {
create_user_and_blog( $username, $password );
$user = apply_filters('authenticate', null, $username, $password);
}
else
do_action('wp_login_failed', $username);
}
return $user;
}
}
//连接LADP服务器 验证用户是否存在
function ladp_authenticate($username, $password) {
global $ladpserver;
global $ladpusername;
global $ladppassword;
global $email;
$sql = mysql_connect( $ladpserver, $ladpusername, $ladppassword );
mysql_select_db( "wordpress", $sql);
mysql_query("SET NAMES 'utf8'", $sql);
$sqlresult = mysql_query("SELECT user_email FROM wp_users WHERE user_login='".$username."' AND user_pass='".$password."'", $sql);
$resultarray = mysql_fetch_array( $sqlresult, MYSQL_ASSOC );
mysql_close( $sql );
if ( !($resultarray == NULL) ) {
$email = $resultarray["user_email"];
return True;
} else
return False;
}
//建立用户和博客
function create_user_and_blog( $username, $password ){
global $email;
global $domain;
global $title;
global $base;
global $wpdb;
global $current_site;
//建立用户
if ( empty($username) && empty($email) )
wp_die( __( '用户名和邮箱为空。' ) );
elseif ( empty($username) )
wp_die( __( '用户名为空。' ) );
elseif ( empty($email) )
wp_die( __( '邮箱为空。' ) );
$user_id = wpmu_create_user( esc_html( strtolower( $username ) ), $password, esc_html( $email ) );
if ( false == $user_id )
wp_die( __( '用户名或邮箱已被使用。' ) );
//添加博客
$domain = strtolower( $username ); //此处使用用户名作为子域名 不知道会不会有格式问题
$title = strtolower( $username );
$email = sanitize_email( $email );
if ( ! is_subdomain_install() ) {
$subdirectory_reserved_names = apply_filters( 'subdirectory_reserved_names', array( 'page', 'comments', 'blog', 'files', 'feed' ) );
if ( in_array( $domain, $subdirectory_reserved_names ) )
wp_die( sprintf( __('以下为 WordPress 保留字,不能用作博客名称: <code>%s</code>' ), implode( '</code>, <code>', $subdirectory_reserved_names ) ) );
}
if ( empty( $domain ) )
wp_die( __( '站点地址为空或无效。' ) );
if ( empty( $email ) )
wp_die( __( '邮箱地址无效。' ) );
if ( !is_email( $email ) )
wp_die( __( '邮箱地址无效。' ) );
if ( is_subdomain_install() ) {
$newdomain = $domain . '.' . preg_replace( '|^www\.|', '', $current_site->domain );
$path = $base;
} else {
$newdomain = $current_site->domain;
$path = $base . $domain . '/';
}
$wpdb->hide_errors();
$id = wpmu_create_blog( $newdomain, $path, $title, $user_id , array( 'public' => 1 ), $current_site->id );
$wpdb->show_errors();
if ( !is_wp_error( $id ) ) {
$dashboard_blog = get_dashboard_blog();
if ( !is_super_admin( $user_id ) && get_user_option( 'primary_blog', $user_id ) == $dashboard_blog->blog_id )
update_user_option( $user_id, 'primary_blog', $id, true );
$content_mail = sprintf( __( "新站点由 %1s 建立\n\n地址: http://%2s\n名称: %3s"), $current_user->user_login , $newdomain . $path, stripslashes( $title ) );
wp_mail( get_site_option('admin_email'), sprintf( __( '新站点建立:[%s]' ), $current_site->site_name ), $content_mail, '来自: "站点管理员" <' . get_site_option( 'admin_email' ) . '>' );
wpmu_welcome_notification( $id, $user_id, $password, $title, array( 'public' => 1 ) );
//此处重定向后 就得重新登录一次 故注释掉
//wp_redirect( $path );
//exit();
} else {
wp_die( $id->get_error_message() );
}
}
?>
鉴定完毕,博主人才……我没研究过WP的代码……呵呵
@天涯 晕我对php基本不了解 看了一下午才找到wordpress用来认证用户的函数……