我正在构建一个wordpress系统,我想从外部源而不是wordpress DB对用户进行身份验证。我正在使用 wsdl 服务与外部数据库通信,并且我正在根据他们的凭据获取正确的用户信息。但是,我不知道如何进一步处理获得的结果。有人请帮助我。
以下是我到目前为止完成的步骤
在可插拔中创建自定义函数.php并在user.php
中调用它
function wp_authenticate_username_password($user, $username, $password) {
if ( is_a($user, 'WP_User') ) { return $user; }
if ( empty($username) || empty($password) ) {
if ( is_wp_error( $user ) )
return $user;
$error = new WP_Error();
if ( empty($username) )
$error->add('empty_username', __('<strong>ERROR</strong>: The username field is empty.'));
if ( empty($password) )
$error->add('empty_password', __('<strong>ERROR</strong>: The password field is empty.'));
return $error;
}
//$user = get_user_by('login', $username); /*Replaced it with the below*/
$user = validate_ep($username,$password);
echo "<pre>";
print_r($user); /*Produces the result in step 3*/
echo "</pre>";
exit;
pluggable.php
中与外部数据库通信的自定义函数
function validate_ep($username, $userpwd) {
$wsdl = "my web service path";
$client = new SoapClient($wsdl); //(Parameter is the wsdl file in which the services are written.
$newObj = new stdClass;
$user_name = ucfirst($username);
$user_pwd = md5($userpwd);
$display_type = 'wp';
try {
$result = $client->log_process(array(0 => $user_name, 1 => $user_pwd, 2 => $display_type));
if ($result==FALSE)
return FALSE;
foreach($result->item as $key=>$valObj) {
if(!is_numeric($valObj->key)) {
$newObj->{$valObj->key} = $valObj->value;
}
}
/*$actual = unserialize(base64_decode($result));*/
if (count($result) > 0) {
$user = new WP_User;
$user->init($newObj);
return $user;
}
} catch (SoapFault $exp) {
//print_r( $exp->getMessage());
}
return false;
}
从 Web 服务返回的结果
WP_User Object
(
[data] => stdClass Object
(
[id] => ID
[organization] => ID
[login] => UserName
[password] => ***
[name] => Name
)
[ID] => 0
[caps] => Array
(
)
[cap_key] => wp_capabilities
[roles] => Array
(
)
[allcaps] => Array
(
)
[filter] =>
)
在这些步骤之后,有人请帮助我该怎么办。
我建议不要像user.php
那样更改WordPress核心文件,因为一旦WordPress核心升级,它就会被覆盖。相反,我建议阅读以下文章:
WordPress替换内置用户身份验证
它在视频演示中也有解释。
我在下面添加仅摘要:
替换内置身份验证时要记住的事项
WordPress严重依赖其内置的用户系统。正因为如此,WordPress数据库中有很多对用户的引用。虽然有点烦人,但解决这些限制仍然相当简单。
WordPress要求真实用户(WordPress用户)存在于WordPress数据库中,以便对该用户执行操作。幸运的是,WordPress包含创建,操作和删除用户的功能。因此,当我们构建服务时,我们实际上将采取以下步骤,这些步骤应该与身份验证类型无关:
- 通过备用方法对用户进行身份验证
- 如果无效用户显示无效登录消息
- 如果有效用户
- 检查用户是否存在于 WordPress 用户表中
- 如果用户存在,则在WP_User对象中加载并返回用户数据
- 如果用户不存在
- 从备用身份验证服务用户信息自动创建新用户
- 创建用户后,在WP_User对象中加载和返回用户数据