Añadir un captcha al formulario de acceso es bastante fácil y puede hacerse en tres pasos:
- En models/LoginForm.php debes añadir campos captcha y reglas de validación.
- En views/site/login.php tienes que poner un campo captcha.
- En controllers/SiteController.php tendrás que añadir la acción captcha.
En este tutorial, quiero mostrarte cómo crear un captcha en el formulario de inicio de sesión, pero puedes añadir un captcha a cualquier formulario siguiendo estos pasos.
1. Añadir campos captcha y reglas de validación a models/LoginForm.php
En primer lugar, tienes que cambiar el formulario de inicio de sesión como se ha descrito anteriormente. A continuación, tendrás que añadir una propiedad pública llamada verifyCode y sus reglas de validación.
class LoginForm extends Model
{
.............
.............
public $verifyCode;
.............
public function rules()
{
return [
.............
.............
['verifyCode', 'required', 'when'=>function(){return $this->loginFailed;}],
['verifyCode', 'captcha', 'when'=>function(){return $this->loginFailed;}],
.............
.............
];
}
public function validatePassword($attribute, $params)
{
if (!$this->hasErrors()) {
.............
if (!$user || !$user->validatePassword($this->password)) {
Yii::$app->session->set('_loginAttempts', Yii::$app->session->get('_loginAttempts', 0)+1);
.............
}
}
}
//Check number login failed
public function getLoginFailed()
{
return Yii::$app->session->get('_loginAttempts', 0) > 3;
}
.............
.............
}2. Añadir widgets a views/site/login.php
.............
.............
<div class="site-login">
.............
.............
<div class="row">
<div class="col-lg-5">
<?php $form = ActiveForm::begin(['id' => 'login-form']); ?>
.............
.............
<?php
if($model->loginFailed){
echo $form->field($model, 'verifyCode')->widget(\yii\captcha\Captcha::class);
}
?>
.............
.............
<?php ActiveForm::end(); ?>
</div>
</div>
</div>3. Añadir acción al controlador/SiteController.php
Para que los captchas funcionen, tendrás que añadir una acción captcha a controllers/SiteController.php. Puede que la acción ya exista porque la plantilla estándar de la aplicación Yii2 la añade automáticamente..
.............
.............
class SiteController extends Controller
{
.............
.............
public function actions()
{
return [
.............
.............
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
],
.............
.............
];
}
.............
.............
}
