Очень простое подтверждение email (верификация) в Laravel rpilot62.ru — rpilot62.ruite

Содержание

Как отключить регистрацию нового пользователя в Laravel 5

Если вы похожи на меня, то многие приложения, которые вы пишите с помощью Laravel, имеют схожий каркас: регистрация пользователя, вход, сброс пароля, страница публичных продаж, информационная панель (dashboard) для залогиненного пользователя, маршрут выхода и базовые стили Bootstrap, если вы только начали разработку.

Раньше всё это присутствовало прямо из коробки (примечания переводчика: указанные ниже файлы-шаблоны присутствовали в скелетоне приложения, который разворачивался при установке, — не в самом фреймворке). К моему великому огорчению, это исчезло в последнее время, но теперь эти заготовки доступны через Artisan-команду (примечания переводчика: и это правильно):

Какие возможности это нам предоставляет? Давайте копнём глубже.

Что изменилось?

У нас есть макет/layout () — это ядро этих заготовок, и набор view-шек, которые наследуются от него:

  • welcome.blade.php — публичная страница приветствия
  • home.blade.php — информационная панель (dashboard) для вошедших пользователей
  • auth/login.blade.php — страница входа
  • auth/register.blade.php — страница регистрации
  • auth/passwords/email.blade.php — страница подтверждения сброса пароля
  • auth/passwords/reset.blade.php — страница для сброса пароля
  • auth/emails/password.blade.php — email для сброса пароля

Наша публичная страница приветствия по-прежнему маршрутизируется через :

Но теперь у нас есть , который обслуживает нашу информационную панель:

class HomeController extends Controller { /** * Show the application dashboard.

* * @return Response */ public function index() { return view('home'); } }

Это, конечно, прописано в в группе роутов . И обратите внимание, что здесь есть ещё кое-что новое — вызов метода :

Route::auth()

Метод является сокращением для конфигурирования следующих роутов (маршрутов):

Интерфейс

Теперь давайте взглянем на то, что у нас получилось в браузере:

Как вы можете видеть, у нас есть Bootstrap CSS, базовый макет (layout) приложения на Bootstrap и полезные ссылки для действий с нашей базовой авторизацией.

App.blade.php

Итак, как теперь выглядит наш основной макет (layout)?

Здесь подключены FontAwesome, шрифт Lato, Bootstrap CSS, базовый "тянущийся" макет (layout) с "гамбургером" на мобильной версии, библиотека jQuery, Bootstrap JS, и закомментированные места для подключения дефолтных файлов CSS и JS, если вы решите использовать Elixir.

Также здесь есть верхнее меню навигации, в котором прописаны ссылки на "домашнюю страницу" () и ссылки, перенаправляющие неавторизованных пользователей на страницу либо регистрации, либо входа, а также ссылка выхода для авторизованных пользователей.

Заключение

Вот и всё! В этом нет ничего сложного, но это около 30-60 минут набора кода, которые вы только что сохранили на каждом из приложений, которое нуждается в этом функционале.

phpLaravel5.2authscaffold

2016-09-07alek13Поделиться:оригинал

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

Пролог: официальный пакет для реальной работы

Если вам нужен аккуратный и хорошо поддерживаемый вариант поиска Eloquent-моделей, то Laravel предоставляет для этого официальный пакет. Laravel Scout является пакетом основанным на технике драйверов и реализующий полнотекстовый поиск по Eloquent-моделям. В настоящее время в качестве драйвера он поддерживает только Algolia, но вы можете легко использовать собственный драйвер поиска.

Приступая к работе

В результате должно получиться следующее: мы набираем что-то в поле ввода и отправляем на сервер AJAX-запрос с заданными ключевыми словами.

Авторизация и регистрация

На back-end-е мы получаем ключевые слова и достаём модели, которые соответствуют данному запросу.

Т.к. то, что мы хотим описать в статье — это не более чем демонстрация, то back-end и front-end будут достаточно простыми. Что мы действительно хотим здесь подчеркнуть — ключевые моменты и фичи, которые делают поиск более удобным.

Реализация back-end

Зачастую мы хотим реализовать более сложные вещи, чем просто фильтрация результатов только по одному параметру. Если при этом мы не хотим использовать Scout, мы можем написать наши собственные реализацию поиска по запросу. Мы не будем рассматривать такую реализацию в этом посте, мы просто хотим отметить этот способ работы с несколькими параметрами запроса, которые мы хотим применять и использовать.

Теперь давайте двигаться дальше и создадим контроллер.

// SearchController.php public function search(Request $request) { $posts = Post::where('name', $request->keywords)->get(); return response()->json($posts); }

Как вы видите, тут всё очень просто, но мы должны заметить две вещи:

Первая — мы возвращаем ответ в формате json, потому что мы хотим получить его на front-end-е. Это также означает, что здесь мы должны использовать API-роут, а не обычный веб-роут, но это сейчас второстепенно.

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

В результате, мы получаем Eloquent-коллекцию с соответствующими моделями, которую мы преобразовали в json и сделали удобной для обработки на front-end-е.

Реализация поиска с помощью Vue

Чтобы упростить задачу, у нас будет только поле ввода и список результатов. В качестве первого шага, мы создаем экземпляр Vue и привязываем модель к полю ввода. Затем мы выполняем некие действия, когда значение инпута изменилось. Давайте посмотрим, как это должно выглядеть:

<template> <div> <input type="text" v-model="keywords"> <ul v-if="results.length > 0"> <li v-for="result in results" :key="result.id" v-text="result.name"></li> </ul> </div> </template> <script> export default { data() { return { keywords: null, results: [] }; }, watch: { keywords(after, before) { this.fetch(); } }, methods: { fetch() { axios.get('/api/search', { params: { keywords: this.keywords } }) .then(response => this.results = reponse.data) .catch(error => {}); } } } </script>

Итак, что здесь происходит? В шаблонной части этого кода мы привязываем модель Vue и пробегаем по результатам. В скриптовой части мы задаём данные, которые мы хотим использовать, и определяем метод , который является оберткой для axios-запроса.

Также мы прописываем "наблюдателя" за изменениями данных. И когда в  меняется значение свойства , мы снова вызываем метод с новыми ключевыми словами и  выводим новые результаты.

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

Подавление "дребезга" для v-model

В чем проблема у текущего кода? Сейчас мы обращаемся за данными сразу после того, как пользователь напечатал букву.

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

Первый способ — это модификатор . С этим модификатором синхронизация будет происходить не по соботию , а по событю . Это означает, что модель будет обновляться только по событию blur или по нажатию enter. Вы можете посмотреть документацию здесь. Если вам и не нужно большего, то это простое в реализации и использовании решение.

Другой способ — реализовать нашей v-модели. На самом деле, в Vue v1 у нас было подавление дребезга, но оно было удалено в версии 2. Как описано в руководстве по миграции, мы можем использовать библиотеку debounce из lodash (_), но, на мой взгляд, если мы можем использовать наше собственное решение, это как раз тот случай, когда мы должны это сделать.

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

Чтобы заставить его работать, вы должны добавить модификатор  к модели! Не забывайте это!

Итак, допустим, мы интегрировали debounce. Теперь, если мы хотим, мы можем отложить какие-либо изменения в нашей Vue-модели. Представьте, что если нет никаких изменений в заданном интервале, мы передаём последнее состояние в модель. Вызывается метод и мы можем получить новые данные. Но мы делаем это только один раз, вместо 4-5 раз.

Если мы хотим добавить задержку в 300мс в нашей v-модели, мы можем сделать это так:

<input type="text" v-model.lazy="keywords" v-debounce="300">

Вот и всё! В конце мы покажем полный пример с этим решением.

Подсветка результатов

С точки зрения UX, эта часть является значительной. Если бы мы могли выделить совпадения с ключевыми словами, это был бы хороший способ помочь пользователю найти быстрее то, что он(а) хочет.

Это можно реализовать простым одностроковым методом, который находит соответствия и оборачивает их в подсвечивающую разметку. Мы можем положить его в раздел с методами и легко использовать.

highlight(text) { return text.replace(new RegExp(this.keywords, 'gi'), '<span class="highlighted">$&</span>'); }

Как видите, мы возвращаем HTML, а не простую строку. Это означает, что мы должны заменить на .

Заключение

Как мы видим, это не особо сложно написать простой AJAX-поиск по введённому тексту. Самым тяжелым, как всегда, было найти и интегрировать небольшие, но полезные фичи — такие, как подавление дребезга или подсветка. Нам кажется, что уделяя внимание таким мелочам, как эти, вы сделаете ваше приложение намного лучше и более отзывчивее, чем вы думаете.

Как и обещали, вы можете найти полностью рабочее решение (без back-end) здесь: https://jsfiddle.net/hej7L1jy/2/.

Оно немного изменено, т.к. нам нужна немного другая логика, если мы работаем со статическими данными. Мы надеемся, что вы сможете использовать любую из этих фич!

phpLaravelvue.jsinstantsearchajax

2017-11-07alek13Поделиться:оригинал

Аутентификация

Введение

Laravel позволяет сделать аутентификацию очень простой. Фактически, почти всё уже готово к использованию «из коробки». Настройки аутентификации находятся в файле , который содержит несколько хорошо документированных опций для настройки механизма аутентификации.

По умолчанию, Laravel использует модель в каталоге . Эта модель может использоваться вместе с драйвером аутентификации на базе Eloquent.

В Laravel уже включены все необходимые миграции для создания аутентификации, но при самостоятельном создании схемы БД не забудьте про два обязательных поля в таблице (или аналогичной):

  • поле с паролем длиной минимум в 60 символов,
  • поле для хранения идентификаторов «запомнить меня» длиной в 100 символов (можно создать методом в миграции).

Если ваше приложение не использует Eloquent, вы можете использовать драйвер аутентификации , который работает через конструктор запросов.

Аутентификация пользователей

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

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

Регистрация пользователей

Для редактирования набора полей формы, которую заполняет пользователь при регистрации, необходимо изменить класс , который так же отвечает за валидацию введённых данных и создание новых пользователей.

Метод класса содержит правила валидации для новых пользователей, тогда как метод отвечает непосредственно за создание новой записи о пользователе в БД вашего приложения. Вы можете изменять код этих методов при необходимости. вызывается в контроллере через метод, находящийся в трейте .

Ручная аутентификация

Если вы не хотите использовать механизм, предоставляемый контроллером , то вы должны использовать сервис аутентификации напрямую. Не волнуйтесь, это не сложно! Для начала, давайте посмотрим на метод :

Метод принимает массив «ключ-значение» в качестве первого аргумента. Значение ключа будет захэшировано. Другие значения массива используются для поиска пользователя в таблице БД.

В примере выше, пользователь будет выбираться по полю . Если пользователь будет найден, то хэшированный пароль из БД будет сравнён с хэшированным значение поля из переданного массива. Если два этих хэша совпадут, то для пользователя будет создана новая аутентифицированная сессия.

Метод возвращает , если аутентификация прошла успешно, и в противном случае.

Примечание: В примере выше, поле не является обязательным, оно выбрано для примера. Вы должны использовать то название колонки, в котором хранится логин в приложении. Как правило, это «username».

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

Аутентификация пользователя с дополнительными условиями

Вы можете добавить дополнительные условия в аутентификационный запрос:

Как узнать, что пользователь прошел аутентификацию?

Для проверки, аутентифицирован ли пользователь в вашем приложении, можно использовать метод :

Аутентификация и «запоминание» пользователя

Если вы хотите разрешить пользователям использовать механизм «запомнить меня», вы можете передать булево значение вторым аргументом в метод , что позволит сохранить статус аутентификации пользователя либо навсегда, либо до тех пор, пока он сам не выйдет из приложения. Естественно, ваша табличка должна содержать колонку , которая будет использоваться для хранения токена пользователя.

Если вы «запоминаете» пользователя, то можете использовать метод чтобы определить, был ли пользователь аутентифицирован с использованием этого механизма:

Аутентификация пользователя по ID

Для аутентификации пользователя по его ID существует метод :

Проверка прав пользователя без аутентификации

Метод позволяет проверить права пользователя без фактической аутентификации:

Аутентификация пользователя на время выполнения текущего запроса

Метод служит для аутентификация пользователя на время выполнения текущего запроса, при этом не используются сессия и куки:

Ручная аутентификация пользователя

Для принудительной аутентификации пользователя существует метод :

Это эквивалентно аутентификации с использованием метода и передачей параметров пользователя.

Выход из приложения

Конечно, если вы используете встроенные контроллеры Laravel для аутентификации, то в них всё это уже реализовано.

События при аутентификации

При вызове метода запускается событие. Если аутентификация прошла успешно и пользователь вошёл в приложение, будет запущено событие .

Получение аутентифицированного пользователя

Как только пользователь аутентифицирован, вы можете получить объект пользователя несколькими путями.

Во-первых, с помощью фасада :

Во-вторых, используя метод класса :

В третьих, можно использовать мощь сервис-контейнера, указав в качестве аргумента в конструкторе или методе контракт :

Ограничение доступа к роутам

Вы можете использовать посредников (middleware) для ограничения доступа к роутам. В Laravel уже есть посредник , который находится в файле . Всё, что вам нужно — указать его в описании нужного роута:

Аутентификация на основе HTTP Basic

Аутентификация на основе HTTP Basic позволяет аутентифицировать пользователей быстро и без отдельной страницы входа. Для этого надо указать посредника в описании нужного роута:

Защита роута при помощи HTTP Basic

По умолчанию, посредник использует поле из таблицы пользователей в качестве идентификатора пользователя.

Настройка Stateless HTTP Basic фильтра

Так же можно использовать аутентификацию на основе HTTP Basic без создания сессии и идентификационной куки, что часто используется для аутентификации через API. Для этого нужно создать посредника, который будет вызывать метод :

Если вы используете PHP в режиме FastCGI, то аутентификация на основе HTTP Basic может не работать «из коробки». Решается эта проблема добавлением следующих строк в файл :

Напоминание и сброс пароля

Модель и таблица

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

Для начала, удостоверьтесь, что ваша модель реализует контракт в том случае, если вы не используете стандартную модель , которая уже реализует этот контракт при помощи трейта .

Создание миграции для таблицы с напоминаниями паролей

Далее нужно создать таблицу, хранящую токены-напоминания для сброса пароля. Эта миграция уже включена в Laravel и находится в папке . Поэтому всё, что вам нужно сделать, это выполнить команду:

Контроллер напоминания паролей

Laravel так же предоставляет контроллер , который содержит всю логику для работы со сбросом паролей. Так же есть и начальные шаблоны! Шаблоны находятся в папке и вы можете изменять их так, как вам нужно.

Пользователь получает письмо со ссылкой, обрабатываемой методом в контроллере . Это метод отображает форму, где пользователь указывает новый пароль.

Authorization

После этого пользователь автоматически аутентифицируется и перенаправляется на адрес . Вы можете задать свой адрес в свойстве контроллера :

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

Аутентификация через социальные сети

В добавок к обычной аутентификации, с помощью форм и HTTP Basic, Laravel предоставляет простой и удобный механизм аутентификации через OAuth, используя Laravel Socialite. Socialite пока что поддерживает аутентификацию только через Facebook, Twitter, Google и GitHub.

Чтобы начать использовать Socialite, добавьте этот пакет в ваш файл :

После, зарегистрируйте провайдер в файле . Вы так же можете зарегистрировать фасад :

Далее вам необходимо указать параметры для того сервиса OAuth, который вы используете. Это можно сделать в файле . Пока доступно четыре сервиса: , , и . Пример:

После этого нужно добавить два роута: один для перенаправления пользователя к провайдеру OAuth, второй для получения ответа от провайдера после аутентификации пользователя. Пример с использованием фасада :

Метод выполнит перенаправление к провайдеру OAuth, а метод получит информацию о пользователе из ответа провайдера OAuth. Перед перенаправлением, вы можете указать области доступа:

Как только вы получите объект пользователя, можно получить пользовательские данные:

Получение данных пользователя

Добавить комментарий

Закрыть меню