WordPress 的登录机制

入口文件./wp-login.php

一、登出

登出代码中的核心函数是wp_logout(), 此函数位于./wp-includes/pluggable.php,

从代码看, 它完成了清楚服务器端session和客户端的cookie的任务。

function wp_logout() {
    wp_destroy_current_session();
    wp_clear_auth_cookie();
    ......
}

二、登录

核心函数是wp_signon, 此函数位于./wp-includes/user.php

function wp_signon( $credentials = array(), $secure_cookie = '' ) {
      ......
      $user = wp_authenticate($credentials['user_login'], 
                $credentials['user_password']);
      if ( is_wp_error($user) ) {//登录失败
          if ( $user->get_error_codes() == 
                        array('empty_username', 'empty_password') ) {
              $user = new WP_Error('', '');
          }

          return $user;
      }
      // 登录成功, 设置cookie
      wp_set_auth_cookie($user->ID, $credentials['remember'], $secure_cookie);
      ......
}

登录成功后, 会执行函数wp_set_auth_cookie

       function wp_set_auth_cookie {
           ....
           setcookie(LOGGED_IN_COOKIE, $logged_in_cookie, $expire, 
                        COOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true);
           if ( COOKIEPATH != SITECOOKIEPATH )
                setcookie(LOGGED_IN_COOKIE, $logged_in_cookie, 
                        $expire, SITECOOKIEPATH, COOKIE_DOMAIN, 
                         $secure_logged_in_cookie, true);  
       }

因此, 检查wp_signon进行登录成功与否的方式就是

       $user = wp_signon( '', $secure_cookie );
       if ( empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) {
           // 登录失败  
       } else {
           // 登录成功
       }

三、注册

核心函数为 register_new_user(), 位于./wp-includes/user.php, 希望修改网站的注册方式, 需要从修改这个函数入手。

默认的注册流程为: 首先填写账户名和邮箱进行初步注册; 接着系统将自动生成的密码发送到用户邮箱;用户登录邮箱,获取密码后, 才能登录到wordpress系统。 与现在大多数的互联网站点相比, 这个流程实在复杂。 于是就需要通过插件, 修改默认注册流程: 在第一步,填写用户名邮箱的同时, 用户自己填写密码, 具体的实现文章请参考wordpress注册界面:用户填写密码

四、 找回密码

核心函数retrieve_password(), 位于./wp-login.php. 它完成向用户发送充值密码邮件的工作。

 

五、判断是否登录

is_user_logged_in()[位于./wp-includes/pluggable.php], 返回布尔值, 代表登录是否成功。

从全局变量$current_user中判断用户是否登录。

function is_user_logged_in() {
        $user = wp_get_current_user(); 
        return  $user->exists();
}

 

function _wp_get_current_user() {
     global $current_user;

     if ( ! empty( $current_user ) ) {
         if ( $current_user instanceof WP_User ) {
         return $current_user;
     }
     ......
}

五、 密码

class PasswordHash位于./wp-includes/class-phpass.php。wordpress采用了phpass算法, 可到此处下载算法的实现:http://www.openwall.com/phpass/。

$wp_hasher = new PasswordHash( 8, true );
// 生成密码hash
$passHash = $wp_hasher->HashPassword($password);
// 判断明文密码是否与hash相匹配
$isPass = $wp_hasher->CheckPassword($password, $passHash);