- Основы
- Конфигурация
- Кастомизация
- Отключение аутентификации
- Кастомная модель пользователя
- Кастомные поля пользователя и профиль
- Ограничение доступа по ролям
- Аутентификационные pipelines
- Кастомизация ответа аутентификации
- Socialite
- Двухфакторная аутентификация
- JWT
Основы
MoonShine предоставляет встроенную систему аутентификации, которая по умолчанию использует собственную модель пользователя и guard.
Это позволяет быстро начать работу с административной панелью, не беспокоясь о настройке аутентификации.
Конфигурация
Основные настройки аутентификации находятся в файле конфигурации config/moonshine.php в секции auth.
'auth' => ['enabled' => true,'guard' => 'moonshine','model' => MoonshineUser::class,'middleware' => [Authenticate::class,],'pipelines' => [],],'auth' => ['enabled' => true,'guard' => 'moonshine','model' => MoonshineUser::class,'middleware' => [Authenticate::class,],'pipelines' => [],],
Здесь вы можете настроить:
enabled- включение/отключение встроенной аутентификации,guard- имя guard'а для аутентификации,model- класс модели пользователя,middleware- массив middleware для маршрутов аутентификации,pipelines- дополнительные pipeline'ы для процесса аутентификации.
Кастомизация
Вы можете настроить аутентификацию в moonshine.php.
'auth' => ['enabled' => true,'guard' => 'moonshine','model' => CustomUser::class,'middleware' => [CustomAuthMiddleware::class,],'pipelines' => [TwoFactorAuthentication::class,PhoneVerification::class,],],'auth' => ['enabled' => true,'guard' => 'moonshine','model' => CustomUser::class,'middleware' => [CustomAuthMiddleware::class,],'pipelines' => [TwoFactorAuthentication::class,PhoneVerification::class,],],
Отключение аутентификации
Если вы хотите отключить встроенную аутентификацию MoonShine.
'auth' => ['enabled' => false,// ...],'auth' => ['enabled' => false,// ...],
Кастомная модель пользователя
Если вы хотите использовать собственную модель пользователя вместо MoonshineUser, вы можете указать её в конфигурации.
'auth' => ['model' => App\Models\Admin::class,],'auth' => ['model' => App\Models\Admin::class,],
Кастомные поля пользователя и профиль
MoonShine позволяет настроить поля пользователя, используемые для аутентификации и профиля.
'user_fields' => ['username' => 'email','password' => 'password','name' => 'name','avatar' => 'avatar',],'user_fields' => ['username' => 'email','password' => 'password','name' => 'name','avatar' => 'avatar',],
$config->userField('username', 'login')->userField('password', 'pass')->userField('name', 'full_name')->userField('avatar', 'profile_image');$config->userField('username', 'login')->userField('password', 'pass')->userField('name', 'full_name')->userField('avatar', 'profile_image');
При этом если вы хотите полностью заменить страницу профиля на свою, то можете это сделать через конфигурацию.
'pages' => ['profile' => App\MoonShine\Pages\CustomProfile::class,],'pages' => ['profile' => App\MoonShine\Pages\CustomProfile::class,],
$config->changePage(\MoonShine\Laravel\Pages\ProfilePage::class,\App\MoonShine\Pages\CustomProfile::class);$config->changePage(\MoonShine\Laravel\Pages\ProfilePage::class,\App\MoonShine\Pages\CustomProfile::class);
Ограничение доступа по ролям
Если вам нужно ограничить доступ к административной панели MoonShine на основе ролей пользователей или других условий,
вы можете легко добавить собственный middleware.
Создание middleware
Создайте новый middleware, например, CheckAdminRole.
namespace App\Http\Middleware;use Closure;use Illuminate\Http\Request;use Symfony\Component\HttpFoundation\Response;class CheckAdminRole{public function handle(Request $request, Closure $next): Response{if ($request->user() && ! $request->user()->hasRole('admin')) {abort(403, 'Access denied.');}return $next($request);}}
namespace App\Http\Middleware;use Closure;use Illuminate\Http\Request;use Symfony\Component\HttpFoundation\Response;class CheckAdminRole{public function handle(Request $request, Closure $next): Response{if ($request->user() && ! $request->user()->hasRole('admin')) {abort(403, 'Access denied.');}return $next($request);}}
Добавление middleware в конфигурацию
'middleware' => [// ... other middleware\App\Http\Middleware\CheckAdminRole::class,],'middleware' => [// ... other middleware\App\Http\Middleware\CheckAdminRole::class,],
Аутентификационные pipelines
Аутентификационные pipelines в MoonShine позволяют добавлять дополнительные проверки и действия в процесс аутентификации после успешной проверки логина и пароля.
Настройка pipelines
'auth' => [// ...'pipelines' => [// ...],],'auth' => [// ...'pipelines' => [// ...],],
$config->authPipelines([\App\MoonShine\AuthPipelines\TwoFactorAuthentication::class,\App\MoonShine\AuthPipelines\PhoneVerification::class,]);$config->authPipelines([\App\MoonShine\AuthPipelines\TwoFactorAuthentication::class,\App\MoonShine\AuthPipelines\PhoneVerification::class,]);
Создание pipeline
Например, подтверждение входа по номеру телефона:
namespace App\MoonShine\AuthPipelines;use Closure;use MoonShine\Laravel\Models\MoonshineUser;class PhoneVerification{public function handle(Request $request, Closure $next){$user = MoonshineUser::query()->where('email', $request->get('username'))->first();if (! is_null($user) && ! is_null($user->getAttribute('phone'))) {$request->session()->put(['login.id' => $user->getKey(),'login.remember' => $request->boolean('remember'),]);return redirect()->route('sms-challenge');}return $next($request);}}
namespace App\MoonShine\AuthPipelines;use Closure;use MoonShine\Laravel\Models\MoonshineUser;class PhoneVerification{public function handle(Request $request, Closure $next){$user = MoonshineUser::query()->where('email', $request->get('username'))->first();if (! is_null($user) && ! is_null($user->getAttribute('phone'))) {$request->session()->put(['login.id' => $user->getKey(),'login.remember' => $request->boolean('remember'),]);return redirect()->route('sms-challenge');}return $next($request);}}
Преимущества использования pipelines
- Гибкость: Легко добавлять, удалять или изменять порядок проверок,
- Модульность: Каждый аспект расширенной аутентификации изолирован в отдельном классе,
- Расширяемость: Простое добавление новых методов аутентификации или проверок.
Использование аутентификационных pipelines позволяет реализовать сложные сценарии аутентификации, сохраняя чистоту и модульность кода, и дает полный контроль над процессом входа пользователей в административную панель MoonShine.
Кастомизация ответа аутентификации
MoonShine позволяет полностью переопределить поведение при аутентификации и выходе из системы с помощью методов authenticateUsing() и logoutUsing().
Это полезно, когда вам нужно изменить редирект после входа или выхода, добавить дополнительную логику или вернуть кастомный ответ.
authenticateUsing
Метод authenticateUsing() позволяет переопределить поведение после успешной аутентификации.
use Closure;use Symfony\Component\HttpFoundation\Response;$config->authenticateUsing(function (Closure $default): Response {// Кастомный редирект после входаreturn redirect()->to('/dashboard');// Или используйте стандартное поведение// return $default();});
use Closure;use Symfony\Component\HttpFoundation\Response;$config->authenticateUsing(function (Closure $default): Response {// Кастомный редирект после входаreturn redirect()->to('/dashboard');// Или используйте стандартное поведение// return $default();});
Callback-функция получает параметр $default — замыкание, которое выполняет стандартную логику аутентификации.
Вы можете вызвать его для использования поведения по умолчанию или полностью заменить своей реализацией.
logoutUsing
Метод logoutUsing() позволяет переопределить поведение при выходе из системы.
use Closure;use Symfony\Component\HttpFoundation\Response;$config->logoutUsing(function (Closure $default): Response {// Кастомный редирект после выходаreturn redirect()->to('/');// Или используйте стандартное поведение// return $default();});
use Closure;use Symfony\Component\HttpFoundation\Response;$config->logoutUsing(function (Closure $default): Response {// Кастомный редирект после выходаreturn redirect()->to('/');// Или используйте стандартное поведение// return $default();});
Пример использования
use Closure;use Symfony\Component\HttpFoundation\Response;$config->authenticateUsing(function (Closure $default): Response {// Логирование успешного входаlogger()->info('User logged in', ['user' => auth()->id()]);return $default();});$config->logoutUsing(function (Closure $default): Response {// Логирование выходаlogger()->info('User logged out');// Редирект на главную страницу сайта вместо страницы входаreturn redirect()->to('/');});
use Closure;use Symfony\Component\HttpFoundation\Response;$config->authenticateUsing(function (Closure $default): Response {// Логирование успешного входаlogger()->info('User logged in', ['user' => auth()->id()]);return $default();});$config->logoutUsing(function (Closure $default): Response {// Логирование выходаlogger()->info('User logged out');// Редирект на главную страницу сайта вместо страницы входаreturn redirect()->to('/');});
Socialite
Для удобства можно связать аккаунт с социальными сетями и упростить процесс аутентификации.
В основе этого функционала - пакет Laravel Socialite.
Убедитесь, что он у вас установлен и настроен.
Далее установите пакет для интеграции Socialite в MoonShine:
composer require moonshine/socialitecomposer require moonshine/socialite
Выполните миграции:
php artisan migratephp artisan migrate
Опубликуйте файл конфигурации:
php artisan vendor:publish --provider="MoonShine\Socialite\Providers\SocialiteServiceProvider"php artisan vendor:publish --provider="MoonShine\Socialite\Providers\SocialiteServiceProvider"
Далее в конфиге config/moonshine-socialite.php установите доступные драйверы и изображение для кнопки.
return ['drivers' => ['github' => '/images/github.png','facebook' => '/images/facebook.svg',],];return ['drivers' => ['github' => '/images/github.png','facebook' => '/images/facebook.svg',],];
Драйверы должны быть заранее настроены в пакете Socialite.
Добавьте трейт MoonShine\Socialite\Traits\HasMoonShineSocialite к модели, которая отвечает за пользователей админ. панели (по умолчанию это MoonshineUser).
Не забудьте опубликовать модель, если используете конфигурацию по умолчанию:
namespace App\Models;use MoonShine\Socialite\Traits\HasMoonShineSocialite;final class MoonshineUser extends \MoonShine\Laravel\Models\MoonshineUser{use HasMoonShineSocialite;}
namespace App\Models;use MoonShine\Socialite\Traits\HasMoonShineSocialite;final class MoonshineUser extends \MoonShine\Laravel\Models\MoonshineUser{use HasMoonShineSocialite;}
И заменить в файле конфигурации:
'auth' => [// ...'model' => \App\Models\MoonshineUser::class,],'auth' => [// ...'model' => \App\Models\MoonshineUser::class,],
Мы автоматически добавим компонент SocialAuth на страницу профиля и LoginLayout,
но если вы их переопределили и используете собственные, то добавьте компонент самостоятельно.
use MoonShine\Socialite\Components\SocialAuth;protected function components(): iterable{return [// ...SocialAuth::make(profileMode: true),];}
use MoonShine\Socialite\Components\SocialAuth;protected function components(): iterable{return [// ...SocialAuth::make(profileMode: true),];}
Двухфакторная аутентификация
Для дополнительной безопасности вы можете установить двухфакторную проверку аутентификации.
composer require moonshine/two-factorcomposer require moonshine/two-factor
Далее выполните миграции:
php artisan migratephp artisan migrate
Далее добавьте authPipeline:
return [// ...'auth' => [// ...'pipelines' => [MoonShine\TwoFactor\TwoFactorAuthPipe::class],]];return [// ...'auth' => [// ...'pipelines' => [MoonShine\TwoFactor\TwoFactorAuthPipe::class],]];
$config->authPipelines([MoonShine\TwoFactor\TwoFactorAuthPipe::class]);$config->authPipelines([MoonShine\TwoFactor\TwoFactorAuthPipe::class]);
Добавьте трейт MoonShine\TwoFactor\Traits\TwoFactorAuthenticatable к модели, которая отвечает за пользователей админ-панели (по умолчанию это MoonshineUser).
Не забудьте опубликовать модель, если используете конфигурацию по умолчанию:
use MoonShine\TwoFactor\Traits\TwoFactorAuthenticatable;final class MoonshineUser extends \MoonShine\Laravel\Models\MoonshineUser{use TwoFactorAuthenticatable;}
use MoonShine\TwoFactor\Traits\TwoFactorAuthenticatable;final class MoonshineUser extends \MoonShine\Laravel\Models\MoonshineUser{use TwoFactorAuthenticatable;}
И заменить в файле конфигурации:
'auth' => [// ...'model' => App\Models\MoonshineUser::class,],'auth' => [// ...'model' => App\Models\MoonshineUser::class,],
Мы автоматически добавим компонент TwoFactor на страницу профиля, но если вы её переопределили и используете собственную, то добавьте компонент самостоятельно.
protected function components(): iterable{return [// ...MoonShine\TwoFactor\ComponentSets\TwoFactor::make(),];}protected function components(): iterable{return [// ...MoonShine\TwoFactor\ComponentSets\TwoFactor::make(),];}
JWT
MoonShine также предоставляет простой способ переключить панель администратора в режим API и взаимодействовать через токены.
Подробнее читайте в разделе API.