热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

yii2.0-captcha验证码--详细设置

最近看群里问yii2验证码怎么弄的朋友比较多,网站里也有相关教程,不过比较简洁,我想需要来一个详细点的。我把使用Captcha(验证码)分4步:1、确认有没有处理图片的php扩展库,gd库和imagi

最近看群里问yii2验证码怎么弄的朋友比较多,网站里也有相关教程,不过比较简洁,我想需要来一个详细点的。

我把使用Captcha(验证码)分4步:

1、确认有没有处理图片的php扩展库,gd库和imagick库开启一个即可。(这步一般可以略过)

                                             yii2 
通过requirements.php的检查结果

11111.png

yii2会检查开启的这两个库,优先使用imagick库。

22222.png

2、视图文件设置

3333.png

444444.png


如果你是直接在yii2默认控制器SiteController.php渲染的视图,那么上图中captchaAction参数可以不用设置。如果不是,那就必须要指定清楚,因为captchaAction默认site/captcha。如下图:(这个是导致一些朋友验证码出不来的原因)。 
55555.png

3、控制器设置


666666.png

A框部分,指定验证码的类和fixedVerifyCode刷新固定验证码,
至于fixedVerifyCode的作用,可以参考:http://blog.csdn.net/poly_sunny/article/details/19995801
B部分,看了就知道是设置验证码长、宽、高等参数。
如果你的yii程序启用了权限控制,还需要设置

1212.png


允许验证码对应的action在没有登录的情况下也能被访问(这个是导致一些朋友验证码出不来的原因)。

4、模型设置 和 验证码校验

8888888.png

['verifyCode', 'captcha','captchaAction'=>'/user/security/captcha'],

 

C :声明模型属性verifyCodepublic,既是第2步中的fields的第二个参数值,两者需保持一致。

D rules中如果正确定义了'captcha'的规则,则验证码的检测比较不需要其他多余代码,model::valide()的时候会自动校验。如果不定义,也可以自己写校验代码:

      use yii\captcha\CaptchaValidator;

      $caprcha = new CaptchaValidator();

$caprcha->validate($value);

或者

$this->createAction('captcha')->validate( \Yii::$app->request->post( $model->formName() )['verifyCode'], false)



[方法二]

首先对应控制器中定义captcha,对应模型中声明captcha变量。

 public function actions() {
return [
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'height' => 50,
'width' => 80,
'minLength' => 4,
'maxLength' => 4
],
];
}

设置一些简单属性,也可以不设。

对应视图中添加表单:

  = $form->field($user_login,'captcha')->widget(yii\captcha\Captcha::className()
,['captchaAction'=>'user/captcha',
'imageOptions'=>['alt'=>'点击换图','title'=>'点击换图', 'style'=>'cursor:pointer']]);?>

captchaAction 指定captcha所在的控制器路径,默认是‘site/captcha’,不换到指定位置的话,很容易,验证码就显示不出来。
imageOptions设定一些参数,例如 手势,提示等等。

对应布局中,如下:以确保你在点击验证码可以自动刷新

beginPage() ?>
beginBody() ?>
//your codes...

//your codes...
endBody() ?>
endPage() ?>

最后,控制器中调用render而非renderPartial:
return $this->render('login',['user_login'=>$user_login]);


都说是yii里的一个小bug,需手动修改 \yii\captcha\CaptionAction run方法里的 return
$this->renderImage($this->getVerifyCode(true));
← 写入参数 ‘true’(默认是false),验证码 方会刷新。

【方法三】

1,Model:

将验证码加入UserLogin的一个属性:

[php] view plain copy
  1. class UserLogin extends CFormModel  
  2. {  
  3.     public $username;  
  4.     public $password;  
  5.     public $rememberMe;  
  6.     public $verifyCode;  
  7.   
  8.     public function rules()  
  9.     {  
  10.         return array(  
  11.             // username and password are required  
  12.             array('username, password,verifyCode''required'),  
  13.             // rememberMe needs to be a boolean  
  14.             array('rememberMe''boolean'),  
  15.             // password needs to be authenticated  
  16.             array('password''authenticate'),  
  17.             // verifyCode needs to be entered correctly  
  18.             array('verifyCode''captcha''allowEmpty'=>!CCaptcha::checkRequirements()),  
  19.         );  
  20.     }  
  21.   
  22.     /** 
  23.      * Declares attribute labels. 
  24.      */  
  25.     public function attributeLabels()  
  26.     {  
  27.         return array(  
  28.             'rememberMe'=>Yii::t('user',"Remember me next time"),  
  29.             'username'=>Yii::t('user',"username or email"),  
  30.             'password'=>Yii::t('user',"password"),  
  31.             'verifyCode'=>Yii::t('user','Verification Code'),  
  32.         );  
  33.     }  

2,Controller

在LoginController控制器加入映射动作CCaptchaAction

[php] view plain copy
  1. public function actions()  
  2. {  
  3.     return array(  
  4.         // captcha action renders the CAPTCHA image displayed on the contact page  
  5.         'captcha'=>array(  
  6.             'class'=>'CCaptchaAction',  
  7.             'backColor'=>0xf4f4f4,  
  8.             'padding'=>0,  
  9.             'height'=>30,  
  10.             'maxLength'=>4,  
  11.         ),  
  12.         );  
  13. }  
  14.   
  15. ublic function actionLogin()  
  16. {  
  17.       
  18.     if (Yii::app()->user->isGuest) {  
  19.         $model=new UserLogin;  
  20.         // collect user input data  
  21.         if(isset($_POST['UserLogin']))  
  22.         {  
  23.               
  24.             $model->attributes=$_POST['UserLogin'];  
  25. /在此核对验证码  
  26.             if($this->createAction('captcha')->validate($model->verifyCode, false))  
  27.             {  
  28.                 // validate user input and redirect to previous page if valid  
  29.                 if($model->validate()) {  
  30.                 //admin login only  
  31.                 if( Yii::app()->getModule('user')->isAdmin()==1 )  
  32.                 {  
  33.                 $this->lastViset();  
  34.                 if (strpos(Yii::app()->user->returnUrl,'/index.php')!==false)  
  35.                     $this->redirect(Yii::app()->controller->module->returnUrl);  
  36.                 else  
  37.                     $this->redirect(Yii::app()->user->returnUrl);  
  38.                 }else  
  39.                 {//if no admin when login out  
  40.                     $this->redirect(Yii::app()->controller->module->logoutUrl);  
  41.                 }  
  42.             }  
  43.             }else  
  44.             {//提示错误  
  45.                 $model->addError('verifyCode','验证码不对');  
  46.             }  
  47.         }  
  48.         // display the login form  
  49.         $this->render('/user/login',array('model'=>$model));  
  50.     } else  
  51.         $this->redirect(Yii::app()->controller->module->returnUrl);  
  52. }  

在验证用户名密码前,检查验证码:

[php] view plain copy
  1. if($this->createAction('captcha')->validate($model->verifyCode, false))  
  2.                 { 

3,view

在视图中显示验证码图片,输入框

[php] view plain copy
  1. $this->widget('CCaptcha'); ?>  
  2.         echo CHtml::activeTextField($model,'verifyCode',array('tabindex'=>1)); ?> 
[php] view plain copy
  1. "code" class="php">

    "http://my.csdn.net/uploads/201205/18/1337330851_3646.jpg" alt="">  

  2. ---------------------------the end------------------------------------

      
  3.   
  4.   

【方法四】

Yii2.0的自带的验证依赖于GD2或者ImageMagick扩展。

使用步骤如下:

重写yii\web\Controller::actions()方法,用ID"captcha"注册一个CaptchaAction类的action。

在表单模型里面添加一个属性,用来保存用户输入的验证码字符串;这个属性的验证器是"captcha"。

在视图里面,把yii\captcha\Captcha Widget插入到表单里面。

第一步,控制器:

在任意controller里面重写方法

/**
* @inheritdoc
*/

public function actions()
{
return [
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'maxLength' => 5,
'minLength' => 5
],
];
}

第二步,表单模型:

假如是一个登陆表单。

这里只给出验证码相关的部分。

class LoginForm extends Model
{
public $verifyCode;

public function rules()
{
return [
['verifyCode', 'required'],
['verifyCode', 'captcha'],
];
}
}

验证规则里面验证码的验证器是captcha。

第三步,视图:

用ActiveForm生成对应字段。

= $form->field($model, 'verifyCode', [
'options' => ['class' => 'form-group form-group-lg'],
])->widget(Captcha::className(),[
'template' => "{image}",
'imageOptions' => ['alt' => '验证码'],
]); ?>

验证码,生成和验证的整个流程就完成了。

【方法五】



*这个是对应前台模版的action
*/

public function actionLogin()
{
$loginForm = new LoginForm();//这里要把刚才写的类new下,注意你们要引入文件路径额
$this->render('login',array('loginForm'=>$loginForm));//变量传到前台模版
}
/**
* @用户授权规则
*/

public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['logout', 'signup','login'],//这里一定要加
'rules' => [
[
'actions' => ['login','captcha'],
'allow' => true,
'roles' => ['?'],
],
[
'actions'=>['logout','edit','add','del','index','users','thumb','upload','cutpic','follow','nofollow'],
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
],
];
}
/**
* @验证码独立操作 下面这个actions注意一点,验证码调试出来的样式也许你并不满意,这里就可
以需修改,这些个参数对应的类是@app\vendor\yiisoft\yii2\captcha\CaptchaAction.php,可以参照这个
类里的参数去修改,也可以直接修改这个类的默认参数,这样这里就不需要改了
*/

public function actions()
{
return [
// 'captcha' =>
// [
// 'class' => 'yii\captcha\CaptchaAction',
// 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
// ], //默认的写法
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
'backColor'=>0x000000,//背景颜色
'maxLength' => 6, //最大显示个数
'minLength' => 5,//最少显示个数
'padding' => 5,//间距
'height'=>40,//高度
'width' => 130, //宽度
'foreColor'=>0xffffff, //字体颜色
'offset'=>4, //设置字符偏移量 有效果
//'controller'=>'login', //拥有这个动作的controller
],
];
}

到这里第二步 控制器的代码就完成了,其中要加入的类,你们自己要留意,别落下!

第三步:

在view的模版里,我这里是login.php加入以下代码

  
$form = ActiveForm::begin([
'id' => 'login-form',
]);
?>


echo Captcha::widget(['name'=>'captchaimg','captchaAction'=>'login/captcha','imageOptions'=>['id'=>'captchaimg', 'title'=>'换一个', 'alt'=>'换一个', 'style'=>'cursor:pointer;margin-left:25px;'],'template'=>'{image}']);//我这里写的跟官方的不一样,因为我这里加了一个参数(login/captcha),这个参数指向你当前控制器名,如果不加这句,就会找到默认的site控制器上去,验证码会一直出不来,在style里是可以写css代码的,可以调试样式 ?>


ActiveForm::end();
?>



推荐阅读
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
author-avatar
手机用户2502909293
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有