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

Настройка среды
Я предполагаю, что вы начинаете со свежей установки 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. Они могут быстро и надежно помочь вам с широким спектром проблем, так что, вложив небольшие деньги, вы сможете сэкономить много времени!
