{{TOC}} {{DOCVER 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11}} == Введение == .(alert) **Хотите сразу попробовать?** Просто выполните команды %%(sh)php artisan make:auth%% и %%(sh)php artisan migrate%% в свежем приложении Laravel. Затем откройте в браузере %%(t)http://your-app.dev/register%% или любой другой URL, назначенный вашему приложению. Эти команды создадут заготовку для всей вашей системы аутентификации! В Laravel сделать аутентификацию очень просто. Фактически, почти всё сконфигурировано для вас уже из коробки. Конфигурационный файл аутентификации расположен в %%(t)config/auth.php%%. Он содержит несколько хорошо описанных опций для тонкой настройки поведения служб аутентификации. %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) Средства Laravel для аутентификации состоят из "защитников" и "провайдеров". Защитники определяют то, как аутентифицируются пользователи для каждого запроса. Например, Laravel поставляется с защитником "session", который поддерживает состояние с помощью хранилища сессий и cookies. Провайдеры определяют то, как пользователи извлекаются из вашего постоянного хранилища. Laravel поставляется с поддержкой извлечения пользователей с помощью Eloquent и конструктора запросов БД. Но при необходимости вы можете определить для своего приложения дополнительные провайдеры. Не переживайте, если сейчас это звучит запутанно! Для многих приложений никогда не потребуется изменять стандартные настройки аутентификации. %% === Требования для базы данных === По умолчанию в Laravel есть ((/docs/v5/eloquent модель Eloquent)) %%(t)App\User%% в вашем каталоге %%(t)app%%. Эта модель может использоваться с базовым драйвером аутентификации Eloquent. Если ваше приложение не использует Eloquent, вы можете использовать драйвер аутентификации %%(t)database%%, который использует конструктор запросов Laravel. При создании схемы базы данных для модели %%(t)App\User%% создайте столбец для паролей с длиной не менее 60 символов. Хорошим выбором для строкового столбца будет длина 255 символов. Кроме того, перед началом работы удостоверьтесь, что ваша таблица %%(t)users%% (или эквивалентная) содержит строковый столбец %%(t)remember_token%% на 100 символов с допустимым значением %%(t)NULL%%. Этот столбец будет использоваться, чтобы хранить ключи для пользователей, выбравших параметр "запомнить меня" при входе в приложение. == Краткое руководство по аутентификации == Laravel поставляется с несколькими контроллерами аутентификации, расположенными в пространстве имён %%(t)App\Http\Controllers\Auth%%. %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) %%(t)RegisterController%% обрабатывает регистрацию нового пользователя, %%(t)LoginController%% обрабатывает аутентификацию, %%(t)ForgotPasswordController%% обрабатывает отправку по почте ссылок для сброса паролей, %%(t)ResetPasswordController%% содержит логику для сброса паролей. %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) %%(t)AuthController%% обрабатывает регистрацию и аутентификацию нового пользователя, а %%(t)PasswordController%% содержит логику для помощи существующим пользователям при сбросе забытых паролей. %% Каждый из этих контроллеров использует типажи для подключения необходимых методов. Для многих приложений вам вообще не придётся изменять эти контроллеры. === Маршрутизация === %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) Laravel обеспечивает быстрый способ создания заготовок всех необходимых для аутентификации маршрутов и представлений с помощью одной команды: %%(sh) php artisan make:auth ~%% Эту команду надо использовать на свежем приложении, она установит представление макета, представления для регистрации и входа, а также маршруты для всех конечных точек аутентификации. Также будет сгенерирован %%(t)HomeController%% для обслуживания запросов к панели настроек вашего приложения после входа. %% %%(DOCNEW 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) По умолчанию в Laravel нет ((/docs/v5/routing маршрутов)) для запросов к контроллерам аутентификации. Вы можете добавить их вручную в файле %%(t)app/Http/routes.php%%: ~%% // Маршруты аутентификации... Route::get('auth/login', 'Auth\AuthController@getLogin'); Route::post('auth/login', 'Auth\AuthController@postLogin'); Route::get('auth/logout', 'Auth\AuthController@getLogout'); // Маршруты регистрации... Route::get('auth/register', 'Auth\AuthController@getRegister'); Route::post('auth/register', 'Auth\AuthController@postRegister'); ~%% %% === Представления === %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) Как было сказано в предыдущем разделе, команда %%(sh)php artisan make:auth%% создаст все необходимые вам представления для аутентификации и поместит их в папку %%(t)resources/views/auth` directory%%. Также команда %%(sh)make:auth%% создаст папку %%(t)resources/views/layouts%%, содержащую основной макет для вашего приложения. Все эти представления используют CSS-фреймворк Bootstrap, но вы можете изменять их как угодно. %% %%(DOCNEW 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) Не смотря на то, что контроллеры аутентификации включены в фреймворк, вам необходимо предоставить ((/docs/v5/views представления)), которые эти контроллеры смогут отрисовать. Представления необходимо расположить в каталоге %%(t)resources/views/auth%%. Вы вольны настроить эти представления так, как сами желаете. Представление для входа в систему должно быть в %%(t)resources/views/auth/login.blade.php%%, а представление для регистрации - в %%(t)resources/views/auth/register.blade.php%%. **Пример формы аутентификации** ~%%
{!! csrf_field() !!}
Email
Password
Remember Me
~%% **Пример формы регистрации** ~%%
{!! csrf_field() !!}
Name
Email
Password
Confirm Password
~%% %% === Аутентификация === Теперь, когда у вас есть маршруты и представления для имеющихся контроллеров аутентификации, вы готовы регистрировать и аутентифицировать новых пользователей своего приложения. Вы можете просто перейти по этим маршрутам в браузере, поскольку контроллеры аутентификации уже содержат логику (благодаря их типажам) для аутентификации существующих пользователей и сохранения новых пользователей в базе данных. **Изменение пути** %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) Когда пользователь успешно аутентифицируется, он будет перенаправлен на URI %%(t)/home%% (для версии 5.2 - URI %%(t)/%%). Вы можете изменить место для перенаправления после входа, задав свойство %%(t)redirectTo%% контроллеров %%(t)LoginController%%, %%(t)RegisterController%% и %%(t)ResetPasswordController%% (для версии 5.2 - контроллера %%(t)AuthController%%): ~%% protected $redirectTo = '/'; ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) Когда пользователь успешно аутентифицируется, он будет перенаправлен на URI %%(t)/%%. Вы можете изменить место для перенаправления после входа, задав свойство %%(t)redirectTo%% контроллера %%(t)AuthController%%: ~%% protected $redirectTo = '/home'; ~%% %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) Если для генерирования пути для переадресации необходима дополнительная логика, вы можете определить метод %%redirectTo()%% вместо свойства %%(t)redirectTo%%: ~%% protected function redirectTo() { // } ~%% .(alert) У метода %%redirectTo()%% приоритет выше, чем у атрибута %%(t)redirectTo%%. **Изменение пользователя** По умолчанию Laravel использует для аутентификации поле %%(t)email%%. Чтобы изменить это, определите метод %%username()%% в своём %%(t)LoginController%%: ~%% public function username() { return 'username'; } ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) Когда аутентификация пользователя не успешна, он автоматически будет перенаправлен обратно на форму входа. Чтобы изменить место для перенаправления после выхода из приложения, вы можете задать свойство %%(t)redirectAfterLogout%% контроллера %%(t)AuthController%%: ~%% protected $redirectAfterLogout = '/login'; ~%% Если это свойство не задано, пользователь будет перенаправлен на URI %%(t)/%%. %% **Изменение защитника** %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) Вы также можете изменить "защитника", используемого для аутентификации и регистрации пользователей. Для начала определите метод %%guard()%% в контроллерах %%(t)LoginController%%, %%(t)RegisterController%% и %%(t)ResetPasswordController%%. Метод должен возвращать экземпляр защитника: ~%% use Illuminate\Support\Facades\Auth; protected function guard() { return Auth::guard('guard-name'); } ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) Вы также можете изменить "защитника", используемого для аутентификации пользователей. Для начала задайте свойство %%(t)guard%% контроллера %%(t)AuthController%%. Значение этого свойства должно соответствовать одному из защитников, настроенных в вашем файле настроек %%(t)auth.php%%: ~%% protected $guard = 'admin'; ~%% %% %%(DOCNEW 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) Когда пользователь успешно аутентифицирован, он будет переадресован к URI %%(t)/home%%, для обработки которой вам необходимо будет зарегистрировать маршрут. Вы можете настроить место для переадресации после аутентификации, задав свойство %%(t)redirectPath%% в %%(t)AuthController%%: ~%% protected $redirectPath = '/dashboard'; ~%% Когда аутентификация пользователя не успешна, он будет переадресован на URI %%(t)/auth/login%%. Вы можете настроить место для переадресации после неудачной аутентификации, задав свойство %%(t)loginPath%% в %%(t)AuthController%%: ~%% protected $loginPath = '/login'; ~%% Свойство %%(t)loginPath%% не влияет на то, куда будут переходить пользователи при попытке доступа к защищённому маршруту. Это контролируется методом %%handle()%% посредника %%(t)App\Http\Middleware\Authenticate%%. %% **Настройка хранилища/проверки ввода** Чтобы изменить требуемые поля для формы регистрации нового пользователя, или для изменения способа добавления новых пользователей в вашу базу данных, вы можете изменить класс %%(t)RegisterController%% (для версии 5.2 - %%(t)AuthController%%). Этот класс отвечает за проверку ввода и создание новых пользователей в вашем приложении. Метод %%validator()%% класса %%(t)RegisterController%% (для версии 5.2 - %%(t)AuthController%%) содержит правила проверки ввода данных для новых пользователей приложения, а метод %%create()%% этого класса отвечает за создание новых записей %%(t)App\User%% в вашей базе данных с помощью ((/docs/v5/eloquent Eloquent ORM)). Вы можете изменить каждый из этих методов, как пожелаете. === Получение аутентифицированного пользователя === Вы можете обращаться к аутентифицированному пользователю через фасад %%(t)Auth%%: %% use Illuminate\Support\Facades\Auth; // Получить текущего аутентифицированного пользователя... $user = Auth::user(); // Получить ID текущего аутентифицированного пользователя... $id = Auth::id(); %% Или, когда пользователь аутентифицирован, вы можете обращаться к нему через экземпляр %%(t)Illuminate\Http\Request%%. Не забывайте, указание типов классов приводит к их автоматическому внедрению в методы вашего контроллера: %% user() возвращает экземпляр аутентифицированного пользователя... } } %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) Также вы можете указать тип контракта %%(t)Illuminate\Contracts\Auth\Authenticatable%%. Это указание типа может быть добавлено к конструктору контроллера, методу контроллера или любому другому конструктору класса, реализуемому в ((/docs/v5/container сервис-контейнере)): ~%% middleware('auth'); ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) Laravel поставляется с посредником %%(t)auth%%, который определён в %%(t)app\Http\Middleware\Authenticate.php%%. Всё, что вам надо сделать - это присоединить его к определению маршрута: ~%% // С помощью замыкания маршрута... Route::get('profile', ['middleware' => 'auth', function() { // Только аутентифицированные пользователи могут зайти... }]); // С помощью контроллера... Route::get('profile', [ 'middleware' => 'auth', 'uses' => 'ProfileController@show' ]); ~%% %% Конечно, если вы используете ((/docs/v5/controllers контроллеры)), вы можете вызвать метод %%middleware()%% из конструктора контроллера, вместо присоединения его напрямую к определению маршрута: %% public function __construct() { $this->middleware('auth'); } %% **Указание защитника** %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) Во время прикрепления посредника %%(t)auth%% к маршруту, вы можете также указать, какой защитник должен быть использован для аутентификации пользователя. Указанный защитник должен соответствовать одному из ключей в массиве %%(t)guards%% вашего файла %%(t)auth.php%%: ~%% public function __construct() { $this->middleware('auth:api'); } ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) Во время прикрепления посредника %%(t)auth%% к маршруту, вы можете также указать, какой защитник должен быть использован для выполнения аутентификации: ~%% Route::get('profile', [ 'middleware' => 'auth:api', 'uses' => 'ProfileController@show' ]); ~%% Указанный защитник должен соответствовать одному из ключей в массиве %%(t)guards%% конфигурационного файла %%auth.php%%. %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) === Блокировка входа === Если вы используете встроенный в Laravel класс %%(t)LoginController%%, то типаж %%(t)Illuminate\Foundation\Auth\ThrottlesLogins%% уже включён в ваш контроллер. По умолчанию пользователь не сможет войти в приложение в течение одной минуты, если он несколько раз указал неправильные данные для входа. Блокировка происходит отдельно для имени пользователя/адреса e-mail и его IP-адреса. %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=f60f8b3697b3ffe381df4ddb7e2875ffce940643 1.04.2016 17:39:10) === Блокировка аутентификации === Если вы используете встроенный в Laravel класс %%(t)AuthController%%, то вы можете использовать типаж %%(t)Illuminate\Foundation\Auth\ThrottlesLogins%% для блокировки попыток входа в ваше приложение. По умолчанию пользователь не сможет войти в приложение в течение одной минуты, если он несколько раз указал неправильные данные для входа. Блокировка происходит отдельно для имени пользователя/адреса e-mail и его IP-адреса: ~%% $email, 'password' => $password])) { // Аутентификация успешна return redirect()->intended('dashboard'); } } } %% Метод %%attempt()%% принимает массив пар ключ/значение в качестве первого аргумента. Значения массива будут использованы для поиска пользователя в таблице базы данных. Так, в приведённом выше примере пользователь будет получен по значению столбца %%(t)email%%. Если пользователь будет найден, хешированный пароль, сохранённый в базе данных, будет сравниваться с хешированным значением %%(t)password%%, переданным в метод через массив. Если два хешированных пароля совпадут, то для пользователя будет запущена новая аутентифицированная сессия. Метод %%attempt()%% вернёт %%(t)true%%, если аутентификация прошла успешно. В противном случае будет возвращён %%(t)false%%. Метод %%intended()%% "переадресатора" перенаправит пользователя к тому URL, к которому он обращался до того, как был перехвачен посредником аутентификации. В этот метод можно передать запасной URI, на случай недоступности требуемого пути. **Указание дополнительных условий** При необходимости вы можете добавить дополнительные условия к запросу аутентификации, помимо адреса e-mail и пароля. Например, можно проверить отметку "активности" пользователя: %% if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) { // Пользователь активен, не приостановлен, и существует. } %% .(alert) В этих примерах %%(t)email%% не является обязательным вариантом, он приведён только для примера. Вы можете использовать какой угодно столбец, соответствующий "username" в вашей базе данных. %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) **Обращение к конкретным экземплярам защитника** С помощью метода %%guard()%% фасада %%(t)Auth%% вы можете указать, какой экземпляр защитника необходимо использовать. Это позволяет управлять аутентификацией для отдельных частей вашего приложения, используя полностью отдельные модели для аутентификации или таблицы пользователей. Передаваемое в метод %%guard()%% имя защитника должно соответствовать одному из защитников, настроенных в файле %%(t)auth.php%%: ~%% if (Auth::guard('admin')->attempt($credentials)) { // } ~%% %% **Завершение сессии** Для завершения сессии пользователя можно использовать метод %%logout()%% фасада %%(t)Auth%%. Он очистит информацию об аутентификации в сессии пользователя: %% Auth::logout(); %% === Запоминание пользователей === Если вы хотите обеспечить функциональность "запомнить меня" в вашем приложении, вы можете передать логическое значение как второй параметр методу %%attempt()%%, который сохранит пользователя аутентифицированным на неопределённое время, или пока он вручную не выйдет из системы. Конечно, ваша таблица %%(t)users%% должна содержать строковый столбец %%(t)remember_token%%, который будет использоваться для хранения ключей "запомнить меня". %% if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) { // Пользователь запомнен... } %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) .(alert) Если вы используете встроенный в Laravel %%(t)LoginController%%, необходимая логика для "запоминания" пользователей уже реализована типажами, используемыми контроллером. %% Если вы "запоминаете" пользователей, вы можете использовать метод %%viaRemember()%%, чтобы определить, аутентифицировался ли пользователь, используя cookie "запомнить меня": %% if (Auth::viaRemember()) { // } %% === Другие методы аутентификации === **Аутентификация экземпляра пользователя** Если вам необходимо "залогинить" в приложение существующий экземпляр пользователя, вызовите метод %%call()%% с экземпляром пользователя. Данный объект должен быть реализацией ((/docs/v5/contracts контракта)) %%(t)Illuminate\Contracts\Auth\Authenticatable%%. Само собой, встроенная в Laravel модель %%(t)App\User%% реализует этот интерфейс: %% Auth::login($user); %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) ~%% // Войти и "запомнить" данного пользователя... Auth::login($user, true); ~%% Конечно, вы можете указать, какой экземпляр защитника надо использовать: ~%% Auth::guard('admin')->login($user); ~%% %% **Аутентификация пользователя по ID** Для входа пользователя в приложение по его ID, используйте метод %%loginUsingId()%%. Этот метод просто принимает первичный ключ пользователя, которого необходимо аутентифицировать: %% Auth::loginUsingId(1); %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) ~%% // Войти и "запомнить" данного пользователя... Auth::loginUsingId(1, true); ~%% %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) **Проверка данных пользователя без входа в систему** Метод %%validate()%% позволяет проверять учётные данные пользователя без фактического входа в приложение: ~%% if (Auth::validate($credentials)) { // } ~%% %% **Вход пользователя для одного запроса** Вы также можете использовать метод %%once()%% для пользовательского входа в систему для одного запроса. Сеансы и cookies не будут использоваться, что может быть полезно при создании API без состояний (stateless API): %% if (Auth::once($credentials)) { // } %% == Простая HTTP-аутентификация == ((https://en.wikipedia.org/wiki/Basic_access_authentication HTTP Basic Authentication)) — простой и быстрый способ аутентификации пользователей вашего приложения без создания дополнительной страницы входа. Для начала прикрепите посредника %%(t)auth.basic%% к своему маршруту. Этот посредник встроен в Laravel, поэтому вам не надо определять его: %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) ~%% Route::get('profile', function () { // Только аутентифицированные пользователи могут зайти... })->middleware('auth.basic'); ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% Route::get('profile', ['middleware' => 'auth.basic', function() { // Только аутентифицированные пользователи могут зайти... }]); ~%% %% Когда посредник прикреплён к маршруту, вы автоматически получите запрос данных для входа при обращении к маршруту через браузер. По умолчанию посредник %%(t)auth.basic%% будет использовать столбец %%(t)email%% из записи пользователя в качестве "username". **Замечание по FastCGI** Если вы используете PHP FastCGI, то простая HTTP-аутентификация изначально может работать неправильно. Надо добавить следующие строки к вашему файлу %%(t).htaccess%%: %%(conf) RewriteCond %{HTTP:Authorization} ^(.+)$ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] %% === Простая Stateless HTTP-аутентификация === Вы также можете использовать простую HTTP-аутентификацию, не задавая пользовательскую cookie для сессии, что особенно полезно для API-аутентификации. Чтобы это сделать, ((/docs/v5/middleware определите посредника)), который вызывает метод %%onceBasic()%%. Если этот метод ничего не возвращает, запрос может быть передан дальше в приложение: %% middleware('auth.basic.once'); ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% Route::get('api/user', ['middleware' => 'auth.basic.once', function() { // Только аутентифицированные пользователи могут зайти... }]); ~%% %% == Сброс и изменение паролей == .(tl_note) В документации по ветке 5.3 и далее данный раздел статьи был вынесен в отдельную статью - ((//docs/v5/passwords Сброс пароля)) - //прим. пер.// === Требования для базы данных === Большинство веб-приложений предоставляет пользователям возможность сбросить их забытые пароли. Вместо того, чтобы постоянно реализовывать это в каждом новом приложении, Laravel предлагает удобные методы для отправки писем о сбросе пароля и выполнении самого сброса. Для начала проверьте, что ваша модель %%(t)App\User%% реализует контракт %%(t)Illuminate\Contracts\Auth\CanResetPassword%%. Конечно, модель %%(t)App\User%%, встроенная во фреймворк, уже реализует этот интерфейс и использует типаж %%(t)Illuminate\Auth\Passwords\CanResetPassword%% для подключения методов, необходимых для реализации интерфейса. **Создание миграции для таблицы сброса паролей** Затем должна быть создана таблица для хранения ключей сброса пароля. Миграция для этой таблицы включена в Laravel, и находится в каталоге %%(t)database/migrations%%. Вам остаётся только выполнить миграцию: %%(sh) php artisan migrate %% === Маршрутизация === Laravel содержит %%(t)Auth\PasswordController%%, который содержит логику, необходимую для сброса пользовательских паролей. %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) Все необходимые для сброса пароля маршруты можно сгенерировать с помощью Artisan-команды %%(sh)make:auth%%: %%(sh) php artisan make:auth ~%% %% %%(DOCNEW 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) Но вам надо определить маршруты для запросов к этому контроллеру: ~%% // Маршруты запроса ссылки для сброса пароля... Route::get('password/email', 'Auth\PasswordController@getEmail'); Route::post('password/email', 'Auth\PasswordController@postEmail'); // Маршруты сброса пароля... Route::get('password/reset/{token}', 'Auth\PasswordController@getReset'); Route::post('password/reset', 'Auth\PasswordController@postReset'); ~%% %% === Представления === %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) И снова, Laravel создаст все необходимые представления для сброса пароля по команде %%(sh)make:auth%%. Эти представления будут помещены в %%(t)resources/views/auth/passwords%%. Вы можете свободно изменять их для вашего приложения. %% %%(DOCNEW 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) Кроме определения маршрутов для %%(t)PasswordController%%, вам надо предоставить представления, которые могут быть возвращены этим контроллером. Не волнуйтесь, мы предоставили примеры представлений, чтобы вам было легче начать. Вы можете изменить эти шаблоны под дизайн своего приложения. **Пример формы запроса ссылки для сброса пароля** Вам надо сделать HTML-представление для формы запроса сброса пароля. Это представление должно быть помещено в %%(t)resources/views/auth/password.blade.php%%. Эта форма предоставляет единственное поле для ввода адреса e-mail, позволяя запросить ссылку для сброса пароля: ~%%
{!! csrf_field() !!} @if (count($errors) > 0) @endif
Email
~%% Когда пользователь подтвердит запрос на сброс пароля, он получит электронное письмо со ссылкой, которая указывает на метод %%getReset()%% (обычно расположенный по маршруту %%(t)/password/reset%%) контроллера %%(t)PasswordController%%. Вам надо создать представление для этого письма в %%(t)resources/views/emails/password.blade.php%%. Представление получит переменную %%$token%%, которая содержит ключ для сброса пароля, по которому происходит сопоставление пользователя с запросом сброса пароля. Вот пример представления для e-mail: ~%% Нажмите здесь для сброса пароля: {{ url('password/reset/'.$token) }} ~%% **Пример формы сброса пароля** Когда пользователь переходит по ссылке из письма для сброса пароля, ему автоматически будет выведена форма сброса пароля. Это представление необходимо поместить в %%(t)resources/views/auth/reset.blade.php%%. Вот пример формы сброса пароля: ~%%
{!! csrf_field() !!} @if (count($errors) > 0) @endif
Email
Password
Confirm Password
~%% %% === После сброса пароля === Когда вы определили маршруты и представления для сброса паролей пользователей, вы можете просто обратиться к данному маршруту через браузер (%%(t)/password/reset%%). Встроенный в фреймворк %%(t)PasswordController%% содержит логику отправки сообщений со ссылкой для сброса пароля, а также логику обновления паролей в базе данных. После сброса пароля пользователь автоматически войдёт в приложение и будет перенаправлен к %%(t)/home%%. Вы можете изменить этот путь задав свойство %%(t)redirectTo%% в %%(t)PasswordController%%: %% protected $redirectTo = '/dashboard'; %% .(alert) По умолчанию ключи сброса пароля истекают через один час. Вы можете изменить это с помощью параметра %%(t)expire%% в вашем файле %%(t)config/auth.php%%. === Настройка === %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) **Настройка защитника аутентификации** В файле настроек %%(t)auth.php%% вы можете настроить несколько "защитников", которых можно использовать для задания логики аутентификации для нескольких таблиц пользователей. Вы можете изменить встроенный %%(t)PasswordController%%, чтобы он использовал необходимого вам защитника, добавив в контроллер свойство %%(t)$guard%%: ~%% /** * Будет использоваться указанный защитник аутентификации. * * @var string */ protected $guard = 'admins'; ~%% **Настройка брокера паролей** Вы можете настроить несколько "брокеров" паролей в файле настроек %%(t)auth.php%%, их можно использовать для сброса паролей в нескольких таблицах пользователей. Вы можете изменить встроенный %%(t)PasswordController%%, чтобы он использовал необходимого вам брокера, добавив в контроллер свойство %%(t)$broker%%: ~%% /** * Будет использоваться указанный брокер паролей. * * @var string */ protected $broker = 'admins'; ~%% %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) == Добавление собственных защитников == Вы можете определить своих собственных защитников аутентификации с помощью метода %%extend()%% фасада %%(t)Auth%%. Вам нужно разместить этот вызов "провайдера" в ((//docs/v5/providers сервис-провайдере)). Поскольку в Laravel уже есть %%(t)AuthServiceProvider%%, мы можем поместить код в этот провайдер: %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) ~%% registerPolicies(); Auth::extend('jwt', function ($app, $name, array $config) { // Вернуть экземпляр Illuminate\Contracts\Auth\Guard... return new JwtGuard(Auth::createUserProvider($config['provider'])); }); } } ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) ~%% [ 'api' => [ 'driver' => 'jwt', 'provider' => 'users', ], ], ~%% %% %%(DOCNEW 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) == ((#социальная)) Социальная аутентификация == .(tl_note) Для версии 5.2 и выше данный раздел ((https://github.com/laravel/socialite перенесён на GitHub)) - //прим. пер.// В дополнение к обычной аутентификации на основе формы, Laravel также предоставляет простой и удобный способ аутентификации с помощью провайдеров OAuth, используя ((https://github.com/laravel/socialite Laravel Socialite)). **Socialite в настоящее время поддерживает аутентификацию через Facebook, Twitter, LinkedIn, Google, GitHub и Bitbucket**. Чтобы начать работать с Socialite, добавьте зависимость в свой файл %%(t)composer.json%%: %%(conf) composer require laravel/socialite ~%% === Настройка === После установки библиотеки Socialite зарегистрируйте %%(t)Laravel\Socialite\SocialiteServiceProvider%% в своем конфигурационном файле %%(t)config/app.php%%. %%(conf) 'providers' => [ // Другие сервис-провайдеры... Laravel\Socialite\SocialiteServiceProvider::class, ], ~%% Также добавьте фасад %%(t)Socialite%% в массив %%(t)aliases%% в файле %%(t)app%%: %%(conf) 'Socialite' => Laravel\Socialite\Facades\Socialite::class, ~%% Вам будет необходимо добавить учётные данные для сервисов OAuth, которые использует ваше приложение. Эти учётные данные должны быть помещены в ваш конфигурационный файл %%(t)config/services.php%% и должны использовать ключ %%(t)facebook%%, %%(t)twitter%%, %%(t)linkedin%%, %%(t)google%%, %%(t)github%% или %%(t)bitbucket%%, в зависимости от провайдеров, которые необходимы вашему приложению. Например: %%(conf) 'github' => [ 'client_id' => 'your-github-app-id', 'client_secret' => 'your-github-app-secret', 'redirect' => 'http://your-callback-url', ], ~%% === Основы использования === Теперь можно аутентифицировать пользователей! Вам будут нужны два маршрута: один для перенаправления пользователя на провайдер OAuth, и второй для получения обратного вызова от провайдера после аутентификации . Мы обратимся к Socialite через ((/docs/v5/facades фасад)) %%(t)Socialite%%: ~%% redirect(); } /** * Получение информации о пользователе от GitHub. * * @return Response */ public function handleProviderCallback() { $user = Socialite::driver('github')->user(); // $user->token; } } ~%% Метод %%redirect()%% отвечает за отправку пользователя провайдеру OAuth, а метод %%user()%% читает входящий запрос и получает информацию пользователя от провайдера. Прежде чем перенаправить пользователя, вы можете также установить "области видимости" для запроса с помощью метода %%scope()%%. Этот метод переопределит все существующие области видимости: ~%% return Socialite::driver('github') ->scopes(['scope1', 'scope2'])->redirect(); ~%% Само собой, вам необходимо определить маршруты для ваших методов контроллера: ~%% Route::get('auth/github', 'Auth\AuthController@redirectToProvider'); Route::get('auth/github/callback', 'Auth\AuthController@handleProviderCallback'); ~%% Некоторые из провайдеров OAuth поддерживают необязательные параметры в запросе переадресации. Чтобы включить какие-либо необязательные параметры в запрос, вызовите метод %%with()%% с ассоциативным массивом: ~%% return Socialite::driver('google') ->with(['hd' => 'example.com'])->redirect(); ~%% **Получение пользовательских данных** Когда у вас есть экземпляр пользователя, вы можете получить более подробную информацию о пользователе: ~%% $user = Socialite::driver('github')->user(); // Два провайдера OAuth $token = $user->token; // Один провайдер OAuth $token = $user->token; $tokenSecret = $user->tokenSecret; // Все провайдеры $user->getId(); $user->getNickname(); $user->getName(); $user->getEmail(); $user->getAvatar(); ~%% %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) == Добавление собственных провайдеров пользователей == Если вы не используете традиционную реляционную базу данных для хранения ваших пользователей, вам необходимо добавить в Laravel свой собственный провайдер аутентификации пользователей. Мы используем метод %%provider()%% фасада %%(t)Auth%% для определения своего драйвера: %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) ~%% registerPolicies(); Auth::provider('riak', function ($app, array $config) { // Возврат экземпляра Illuminate\Contracts\Auth\UserProvider... return new RiakUserProvider($app->make('riak.connection')); }); } } ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) ~%% [ 'users' => [ 'driver' => 'riak', ], ], ~%% И наконец, вы можете использовать этот провайдер в вашей настройке %%(t)'guards'%%: %%(conf) 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], ], ~%% %% %%(DOCNEW 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01) == Добавление драйверов аутентификации == .(alert) Данный раздел статьи добавлен в документацию для версии 5.1. Для версий 5.2 и выше и 5.0 и ниже он неактуален. Если вы не используете традиционную реляционную базу данных для хранения ваших пользователей, вам необходимо добавить в Laravel свой собственный драйвер аутентификации. Мы используем метод %%extend()%% фасада %%(t)Auth%% для определения своего драйвера. Вам надо поместить этот вызов метода %%extend()%% в ((/docs/v5/providers сервис-провайдер)): ~%% getAuthPassword()%% со значением %%$credentials['password']%%. Этот метод должен возвращать %%true%% или %%false%%, сообщая о правильности пароля. === Контракт Authenticatable === Теперь, когда мы изучили каждый метод в %%(t)UserProvider%%, давайте посмотрим на контракт %%(t)Authenticatable%%. Помните, провайдер должен вернуть реализацию этого интерфейса из методов %%retrieveById()%% и %%retrieveByCredentials()%%: %% [ 'App\Listeners\LogRegisteredUser', ], 'Illuminate\Auth\Events\Attempting' => [ 'App\Listeners\LogAuthenticationAttempt', ], 'Illuminate\Auth\Events\Authenticated' => [ 'App\Listeners\LogAuthenticated', ], 'Illuminate\Auth\Events\Login' => [ 'App\Listeners\LogSuccessfulLogin', ], 'Illuminate\Auth\Events\Failed' => [ 'App\Listeners\LogFailedLogin', ], 'Illuminate\Auth\Events\Logout' => [ 'App\Listeners\LogSuccessfulLogout', ], 'Illuminate\Auth\Events\Lockout' => [ 'App\Listeners\LogLockout', ], ]; ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) ~%% /** * Сопоставления слушателя событий для вашего приложения. * * @var array */ protected $listen = [ 'Illuminate\Auth\Events\Attempting' => [ 'App\Listeners\LogAuthenticationAttempt', ], 'Illuminate\Auth\Events\Login' => [ 'App\Listeners\LogSuccessfulLogin', ], 'Illuminate\Auth\Events\Logout' => [ 'App\Listeners\LogSuccessfulLogout', ], 'Illuminate\Auth\Events\Lockout' => [ 'App\Listeners\LogLockout', ], ]; ~%% %% %%(DOCNEW 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% /** * Регистрация любых других событий для вашего приложения. * * @param \Illuminate\Contracts\Events\Dispatcher $events * @return void */ public function boot(DispatcherContract $events) { parent::boot($events); // Возникает при каждой попытке аутентификации... $events->listen('auth.attempt', function ($credentials, $remember, $login) { // }); // Возникает при успешных входах... $events->listen('auth.login', function ($user, $remember) { // }); // Возникает при выходах... $events->listen('auth.logout', function ($user) { // }); } ~%% %%