Статьи

Используя Фасад Аутентификации Laravel 5

Аутентификация является частью практически всех веб-приложений, с которыми вы работаете. Действительно скучно повторять весь шаблонный код в каждом проекте. Что ж, хорошая новость в том, что Laravel 5 избавляет вас от этой скуки, предоставляя готовый фасад аутентификации.

Все, что вам нужно сделать, это настроить и настроить поставщика услуг аутентификации в соответствии с потребностями вашего проекта. В этом кратком совете я собираюсь показать вам, как именно это сделать.

Если вам нужно готовое, испытанное и протестированное решение, попробуйте Vanguard — Advanced PHP Login и управление пользователями на Envato Market. Это PHP-приложение, написанное на Laravel 5.2, которое позволяет владельцам веб-сайтов быстро добавлять и включать аутентификацию, авторизацию и управление пользователями на своем веб-сайте.

Vanguard - Усовершенствованный логин PHP и управление пользователями на Envato Market
Vanguard — Усовершенствованный логин PHP и управление пользователями на Envato Market

Я предполагаю, что вы начинаете со свежей установки Laravel 5, но вы можете пропустить любой из этих шагов, если вы уже сделали их. Во-первых, вы собираетесь установить некоторые переменные окружения в файле .env в корне вашего проекта. По сути, это связано с конфигурацией базы данных.

01
02
03
04
05
06
07
08
09
10
11
APP_ENV=local
APP_DEBUG=true
APP_KEY=8wfDvMTvfXWHuYE483uXF11fvX8Qi8gC
 
DB_HOST=localhost
DB_DATABASE=laravel_5_authentication
DB_USERNAME=root
DB_PASSWORD=root
 
CACHE_DRIVER=file
SESSION_DRIVER=file

Обратите внимание на APP_ENV , DB_HOST , DB_DATABASE , DB_USERNAME и DB_PASSWORD . Переменная APP_ENV сообщает Laravel, в какой среде мы хотим запустить наше веб-приложение. Остальные имена переменных базы данных довольно очевидны.

Это все, что вам нужно сделать для настройки соединения с базой данных. Но как Laravel использует эти переменные? Давайте рассмотрим файл config/database.php . Вы заметите использование функции env() . Например, env('DB_HOST', 'localhost') . Laravel 5 использует эту функцию для захвата переменных из глобальных массивов $_ENV и $_SERVER , которые автоматически заполняются переменными, которые вы определили в файле .env .

Выполните php artisan migrate:install --env=local в вашем терминале в корне вашего проекта, чтобы установить миграции локально. Также обратите внимание, что в папке database/migrations уже определены две миграции. Используя эти миграции, Laravel 5 создает таблицу users и password_resets , позволяя работать с шаблоном аутентификации по умолчанию. Я собираюсь создать третью миграцию, чтобы изменить таблицу users чтобы показать вам, как настроить настройки аутентификации по умолчанию.

Выполните php artisan make:migration alter_users_table_remove_name_add_first_name_last_name в терминале, чтобы создать третью миграцию.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
 
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
 
class AlterUsersTableRemoveNameAddFirstNameLastName extends Migration {
 
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table(‘users’, function($table){
            $table->dropColumn(‘name’);
            $table->string(‘first_name’, 50)->after(‘id’);
            $table->string(‘last_name’, 50)->after(‘first_name’);
        });
    }
 
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table(‘users’, function($table){
            $table->dropColumn(‘last_name’);
            $table->dropColumn(‘first_name’);
            $table->string(‘name’)->after(‘id’);
        });
    }
 
}

Как видите, вы удалили поле имени и добавили еще два поля для first_name и last_name с максимальной длиной 50 символов. Вы также добавили код, который откатывает эти изменения в базе данных.

Выполните php artisan migrate в терминале. Если миграция прошла успешно, вы сможете увидеть обе таблицы в вашей базе данных с полями, которые вы определили.

Вы собираетесь настроить службу регистрации, чтобы добавить поля таблицы для вновь определенных users .

Отредактируйте файл app/Services/Registrar.php .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php namespace App\Services;
 
use App\User;
use Validator;
use Illuminate\Contracts\Auth\Registrar as RegistrarContract;
 
class Registrar implements RegistrarContract {
 
    /**
     * Get a validator for an incoming registration request.
     *
     * @param array $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    public function validator(array $data)
    {
        return Validator::make($data, [
            ‘first_name’ => ‘required|min:3|max:50’,
            ‘last_name’ => ‘required|min:3|max:50’,
            ’email’ => ‘required|email|max:255|unique:users’,
            ‘password’ => ‘required|confirmed|min:6’,
        ]);
    }
 
    /**
     * Create a new user instance after a valid registration.
     *
     * @param array $data
     * @return User
     */
    public function create(array $data)
    {
        return User::create([
            ‘first_name’ => $data[‘first_name’],
            ‘last_name’ => $data[‘last_name’],
            ’email’ => $data[’email’],
            ‘password’ => bcrypt($data[‘password’]),
        ]);
    }
 
}

Функция validator проверяет данные, переданные из формы регистрации пользователя. Вы удалили поле name по умолчанию и добавили поля first_name и last_name с минимальной длиной три символа и максимальной длиной 50 символов для обоих. Функция create добавляет зарегистрированного пользователя в таблицу users в базе данных, поэтому вам нужно только включить в нее поля first_name и last_name .

Вам также необходимо обновить модель пользователя, включив в нее поля first_name и last_name .

Отредактируйте файл app/User.php .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php namespace App;
 
use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
 
class User extends Model implements AuthenticatableContract, CanResetPasswordContract {
 
    use Authenticatable, CanResetPassword;
 
    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = ‘users’;
 
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [‘first_name’, ‘last_name’, ’email’, ‘password’];
 
    /**
     * The attributes excluded from the model’s JSON form.
     *
     * @var array
     */
    protected $hidden = [‘password’, ‘remember_token’];
 
}

Массив $fillable указывает, какие поля модели открыты для модификации. Как правило, вы не включали бы поля, которые автоматически генерируются в этот массив, или поля, которые не требуют ввода пользователя, такого как хэш для токена запомнить меня. Все, что вы сделали, это обновили массив $fillable чтобы позволить first_name и last_name быть массово назначаемыми.

Наконец, вам просто нужно обновить интерфейсные представления, чтобы они включали поля first_name и last_name . Сначала вы обновите регистрационную форму.

Отредактируйте файл resources/views/auth/register.blade.php .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
@extends(‘app’)
 
@section(‘content’)
 
<div class=»container-fluid»>
    <div class=»row»>
        <div class=»col-md-8 col-md-offset-2″>
            <div class=»panel panel-default»>
                <div class=»panel-heading»>Register</div>
                <div class=»panel-body»>
                    @if (count($errors) > 0)
                        <div class=»alert alert-danger»>
                            <strong>Whoops!</strong> There were some problems with your input.<br><br>
                            <ul>
                                @foreach ($errors->all() as $error)
                                    <li>{{ $error }}</li>
                                @endforeach
                            </ul>
                        </div>
                    @endif
 
                    <form class=»form-horizontal» role=»form» method=»POST» action=»/auth/register»>
                        <input type=»hidden» name=»_token» value=»{{ csrf_token() }}»>
 
                        <div class=»form-group»>
                            <label class=»col-md-4 control-label»>First Name</label>
                            <div class=»col-md-6″>
                                <input type=»text» class=»form-control» name=»first_name» value=»{{ old(‘first_name’) }}»>
                            </div>
                        </div>
 
                        <div class=»form-group»>
                            <label class=»col-md-4 control-label»>Last Name</label>
                            <div class=»col-md-6″>
                                <input type=»text» class=»form-control» name=»last_name» value=»{{ old(‘last_name’) }}»>
                            </div>
                        </div>
 
                        <div class=»form-group»>
                            <label class=»col-md-4 control-label»>E-Mail Address</label>
                            <div class=»col-md-6″>
                                <input type=»email» class=»form-control» name=»email» value=»{{ old(’email’) }}»>
                            </div>
                        </div>
 
                        <div class=»form-group»>
                            <label class=»col-md-4 control-label»>Password</label>
                            <div class=»col-md-6″>
                                <input type=»password» class=»form-control» name=»password»>
                            </div>
                        </div>
 
                        <div class=»form-group»>
                            <label class=»col-md-4 control-label»>Confirm Password</label>
                            <div class=»col-md-6″>
                                <input type=»password» class=»form-control» name=»password_confirmation»>
                            </div>
                        </div>
 
                        <div class=»form-group»>
                            <div class=»col-md-6 col-md-offset-4″>
                                <button type=»submit» class=»btn btn-primary»>
                                    Register
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
 
@endsection

Вы добавили поля first_name и last_name в форму регистрации. Вам также необходимо отредактировать макет приложения по умолчанию в resources/views/app.blade.php чтобы отображать имя пользователя, вошедшего в систему, в меню навигации.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<!DOCTYPE html>
<html lang=»en»>
<head>
    <meta charset=»utf-8″>
    <meta http-equiv=»X-UA-Compatible» content=»IE=edge»>
    <meta name=»viewport» content=»width=device-width, initial-scale=1″>
    <title>Laravel 5: Using The Authentication Facade</title>
 
    <link href=»/css/bootstrap.min.css» rel=»stylesheet»>
    <link href=»/css/bootstrap-theme.min.css» rel=»stylesheet»>
    <link href=»/css/app.css» rel=»stylesheet»>
 
    <!— Fonts —>
    <!—<link href=’//fonts.googleapis.com/css?family=Roboto:400,300′ rel=’stylesheet’ type=’text/css’>—>
 
    <!— HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries —>
    <!— WARNING: Respond.js doesn’t work if you view the page via file:// —>
    <!—[if lt IE 9]>
        <script src=»https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js»></script>
        <script src=»https://oss.maxcdn.com/respond/1.4.2/respond.min.js»></script>
    <![endif]—>
</head>
<body>
    <nav class=»navbar navbar-default»>
        <div class=»container-fluid»>
            <div class=»navbar-header»>
                <button type=»button» class=»navbar-toggle collapsed» data-toggle=»collapse» data-target=»#bs-example-navbar-collapse-1″>
                    <span class=»sr-only»>Toggle Navigation
                    <span class=»icon-bar»>
                    <span class=»icon-bar»>
                    <span class=»icon-bar»>
                </button>
                <a class=»navbar-brand» href=»#»>Laravel</a>
            </div>
 
            <div class=»collapse navbar-collapse» id=»bs-example-navbar-collapse-1″>
                <ul class=»nav navbar-nav»>
                    <li><a href=»/»>Home</a></li>
                </ul>
 
                <ul class=»nav navbar-nav navbar-right»>
                    @if (Auth::guest())
                        <li><a href=»/auth/login»>Login</a></li>
                        <li><a href=»/auth/register»>Register</a></li>
                    @else
                        <li class=»dropdown»>
                            <a href=»#» class=»dropdown-toggle» data-toggle=»dropdown» role=»button» aria-expanded=»false»>{{ Auth::user()->first_name .
                            <ul class=»dropdown-menu» role=»menu»>
                                <li><a href=»/auth/logout»>Logout</a></li>
                            </ul>
                        </li>
                    @endif
                </ul>
            </div>
        </div>
    </nav>
 
    <div class=»container»>
        @yield(‘content’)
    </div>
 
    <!— Scripts —>
    <script src=»//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js»></script>
    <script src=»//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/js/bootstrap.min.js»></script>
</body>
</html>

Чтобы защитить ваши маршруты и разрешить доступ к ним только зарегистрированным пользователям, вам необходимо использовать промежуточное программное обеспечение аутентификации, предоставляемое Laravel. Промежуточное программное обеспечение для аутентификации можно найти по адресу app\Http\Middleware\Authenticate.php .

Вот несколько примеров того, как использовать его для защиты ваших маршрутов.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// route closure
Route::get(‘<your-route-uri>’, [‘middleware’ => ‘auth’, function()
{
    // if user is not logged in
    // he/she will be redirected to the login page
    // and this code will not be executed
}]);
 
// controller action
Route::get(‘<your-route-uri>’, [‘middleware’ => ‘auth’, ‘uses’ => ‘<your-controller>@<your-action>’]);
 
// within a controller
class YourController extends Controller {
 
    public function __construct()
    {
        $this->middleware(‘<your-middleware-name>’);
 
        $this->middleware(‘<another-middleware>’, [‘only’ => [‘<some-action-name>’]]);
 
        $this->middleware(‘<more-middleware>’, [‘except’ => [‘<another-action-name>’]]);
    }
 
}

Вы можете выполнить php artisan route:list в терминале, чтобы проверить маршруты по умолчанию, используемые фасадом аутентификации. Вы можете получить доступ к этим маршрутам, чтобы проверить свой код аутентификации. Вот несколько примеров того, как изменить эти маршруты.

Отредактируйте файл app/Http/routes.php .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Example 1
// login url http://www.example.com/account/login
// logout url http://www.example.com/account/logout
// registration url http://www.example.com/account/register
Route::controllers([
    ‘account’ => ‘Auth\AuthController’,
    ‘password’ => ‘Auth\PasswordController’,
]);
 
// Example 2
// login url http://www.example.com/login
// logout url http://www.example.com/logout
// registration url http://www.example.com/register
Route::controllers([
    » => ‘Auth\AuthController’,
    ‘password’ => ‘Auth\PasswordController’,
]);
 
// Example 3
// redefine all routes
Route::get(‘example/register’, ‘Auth\AuthController@getRegister’);
Route::post(‘example/register’, ‘Auth\AuthController@postRegister’);
Route::get(‘example/login’, ‘Auth\AuthController@getLogin’);
Route::post(‘example/login’, ‘Auth\AuthController@postLogin’);
Route::get(‘example/logout’, ‘Auth\AuthController@getLogout’);
Route::get(‘example/email’, ‘Auth\PasswordController@getEmail’);
Route::post(‘example/email’, ‘Auth\PasswordController@postEmail’);
Route::get(‘example/reset/{code}’, ‘Auth\PasswordController@getReset’);
Route::post(‘example/reset’, ‘Auth\PasswordController@postReset’);

Кроме того, не забудьте динамически вызывать URI в ваших представлениях и шаблонах электронной почты с помощью помощников Laravel. Вы можете увидеть, как это сделать, в репозитории GitHub этого краткого совета.

Функция сброса пароля отправляет ссылку сброса пароля на электронную почту пользователя, поэтому убедитесь, что в вашем проекте Laravel настроена конфигурация почты. Шаблон представления электронной почты для сброса пароля находится по адресу resources/views/emails/password.blade.php . Вы также можете настроить несколько других основных параметров в файле config/auth.php .

Я надеюсь, что вы нашли этот быстрый совет легко следовать. До моего следующего Tuts + кусок, счастливого кодирования!

Кстати, если вам нужна дополнительная помощь в исправлении ошибок или настройке, которая вас не устраивает, обратитесь к одному из поставщиков услуг PHP в Envato Studio. Они могут быстро и надежно помочь вам с широким спектром проблем, так что, вложив небольшие деньги, вы сможете сэкономить много времени!

Поставщики услуг PHP на Envato Studio
Поставщики услуг PHP на Envato Studio