Laravel 自带了用户认证,我们都知道登录界面是没有验证码的,虽然用户输入错误的用户名或密码过多会暂停该用户继续登录,在现实中,不懂技术的人或有些BOSS觉得有验证码“看上去”去才安全,所以我们就要扩展Laravel的 AuthController 认证类。

前言

本文介绍的不是如何扩展认证类 Authcontroller ,而是使用 Laravel 最吸引人的地方:添加扩展包。虽然在别的框架中,扩展早已不是什么新鲜的东西,但绝对没有在 Laravel 中方便。添加扩展避免我们重复造轮子,更多的时间去关注每个项目的业务逻辑层,提升开发效率。

安装

我们通过Composer安装 Captcha 扩展包:

composer require mews/captcha

Or

{
    "require": {
        "mews/captcha": "~2.0"
    },
    "minimum-stability": "dev"
}

composer.json 中添加后,更新包执行: composer update 或者安装 composer install

注:Windows中使用该扩展包还需要安装 GD2扩展(在php.ini中取消php_gd2.dll前面的注释)。

配置

使用 Captcha 还需要在 config/app.php 注册服务提供者:

'providers' => [
    // ...
    Mews\Captcha\CaptchaServiceProvider::class,
]

同时注册下面的Facade:

'aliases' => [
    // ...
    'Captcha' => Mews\Captcha\Facades\Captcha::class,
]

如果想要自定义 Captcha 配置,执行:

$ php artisan vendor:publish

执行完成后就会在 config 文件夹下生成 captcha.php 文件。

  • captcha.php
<?php

return [

    'default'   => [
        'length'    => 4,
        'width'     => 80,
        'height'    => 41,
        'quality'   => 90,
    ],

    'flat'   => [
        'length'    => 6,
        'width'     => 160,
        'height'    => 46,
        'quality'   => 90,
        'lines'     => 6,
        'bgImage'   => false,
        'bgColor'   => '#ecf2f4',
        'fontColors'=> ['#2c3e50', '#c0392b', '#16a085', '#c0392b', '#8e44ad', '#303f9f', '#f57c00', '#795548'],
        'contrast'  => -5,
    ],

    'mini'   => [
        'length'    => 3,
        'width'     => 60,
        'height'    => 32,
    ],

    'inverse'   => [
        'length'    => 5,
        'width'     => 120,
        'height'    => 36,
        'quality'   => 90,
        'sensitive' => true,
        'angle'     => 12,
        'sharpen'   => 10,
        'blur'      => 2,
        'invert'    => true,
        'contrast'  => -5,
    ]

];
`

简单使用

// app/Http/routes.php

Route::any('captcha-test', function()
{
    if (Request::getMethod() == 'POST')
    {
        $rules = ['captcha' => 'required|captcha'];
        $validator = Validator::make(Input::all(), $rules);
        if ($validator->fails())
        {
            echo '<p style="color: #ff0000;">Incorrect!</p>';
        }
        else
        {
            echo '<p style="color: #00ff30;">Matched :)</p>';
        }
    }

    $form = '<form method="post" action="captcha-test">';
    $form .= '<input type="hidden" name="_token" value="' . csrf_token() . '">';
    $form .= '<p>' . captcha_img() . '</p>';
    $form .= '<p><input type="text" name="captcha"></p>';
    $form .= '<p><button type="submit" name="check">Check</button></p>';
    $form .= '</form>';
    return $form;
});

相关函数

如果要返回原生图片,可以调用这个函数:

captcha();

Or

Captcha::create();

如果要返回验证码图片的URL:

captcha_src();

Or

Captcha::src();

如果要返回带 <img src = '...'> 标签的HTML:

captcha_img();

Or

Captcha::img();

要生成不同类型的验证码,配置文件 captcha.php 中不同的配置项,可以这样调用:

captcha_img('flat');
Captcha::img('inverse');

不指定类型默认调用 captcha.php 中的 default 配置

配合Laravel认证类使用

上面只是简单的介绍了 Captcha 的使用,接下来介绍将验证码整合到Laravel认证类(AuthController),而不需要我们自己去写验证码的处理逻辑。接下来我就借用个人博客的代码演示实现的整个流程。

  • 在登录页面(login.blade.php)中显示验证码图片
...

<span class="input-group-btn">
    <img style="cursor: pointer;" src="{{captcha_src()}}" onclick="this.src='{{captcha_src()}}' + Math.random()">
</span>

...

onclick=”this.src=’{{captcha_src()}}’ + Math.random()” 实现的是点击图片更换验证码

  • app/Http/Controllers/Auth/Authcontroller中重写登录验证方法
<?php
namespace App\Http\Controllers\Auth;
use App\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
use Illuminate\Http\Request;
use Captcha;
...

/**
* 重写验证码需要必填
* @param  Request $request [description]
* @return [type]           [description]
*/
protected function validateLogin(Request $request)
{
  $this->validate($request,[
    $this->loginUsername() => 'required',
    'password' => 'required',
    'captcha' => 'required|captcha'  
    ],[
    'captcha.captcha' => trans('validation.captcha'),
    'captcha.required' => trans('validation.captcha_required'),
  ]);
}

关于为能在 Authcontrolle 中重写登录验证方法,原理请看之前写的一篇文章:Laravel5 自定义登录字段 ,上面验证输入的验证码的时候我使用了自定义错误信息,用的多语言,大家根据自己的实际情况做相应的更改就行了。

Laravel5.2中登录验证码一直提示错误问题

如果你的验证码包(mews/captcha)版本是2.12,在laravel 5.2中这个扩展包会出现验证码怎么也无法验证成功的问题,因为5.2采用了middleware分组,并没有使用全局中间件导致这个包没有启用session导致验证码一直提示错误。github上的代码已经是修复了这个Laravel5.2的bug,但是用composer下载的时候代码却没有更新,等作者更新一个版本后估计就没有这个问题了。

手动解决办法

在 vendor\mews\captcha\src\CaptchaServiceProvider.php 中第26行替换一下代码:

// HTTP routing
if (strpos($this->app->version(), 'Lumen') !== false) {
  //Laravel Lumen
  $this->app->get('captcha[/{config}]','Mews\Captcha\LumenCaptchaController@getCaptcha');
} else if (starts_with($this->app->version(), '5.2.') !== false) {
  //Laravel 5.2.x
  $this->app['router']->get('captcha/{config?}','\Mews\Captcha\CaptchaController@getCaptcha')->middleware('web');
} else {
  //Laravel 5.0.x ~ 5.1.x
  $this->app['router']->get('captcha/{config?}','\Mews\Captcha\CaptchaController@getCaptcha');
}

OK,添加验证码包就介绍这里了,如果有上面错误,请指点,非常感谢!

尊重原创,码字辛苦,转载请注明出处,谢谢~


Source: http://blog.iwanli.me/article/KpAVO3xg.html

Leave a comment