- Основы
- Конфигурация
- Кастомизация
- Отключение аутентификации
- Кастомная модель пользователя
- Кастомные поля пользователя и профиль
- Ограничение доступа по ролям
- Аутентификационные 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'ы для процесса аутентификации.
Кастомизация
Вы можете настроить аутентификацию в MoonShineServiceProvider
.
$config->guard('admin')->authMiddleware(CustomAuthMiddleware::class)->authPipelines([TwoFactorAuthentication::class,PhoneVerification::class,]);
$config->guard('admin')->authMiddleware(CustomAuthMiddleware::class)->authPipelines([TwoFactorAuthentication::class,PhoneVerification::class,]);
Отключение аутентификации
Если вы хотите отключить встроенную аутентификацию MoonShine, вы можете сделать это в MoonShineServiceProvider
.
$config->authDisable();
$config->authDisable();
Кастомная модель пользователя
Если вы хотите использовать собственную модель пользователя вместо MoonshineUser
, вы можете указать её в конфигурации.
'auth' => ['model' => App\Models\Admin::class,],
'auth' => ['model' => App\Models\Admin::class,],
Кастомные поля пользователя и профиль
MoonShine позволяет настроить поля пользователя, используемые для аутентификации и профиля.
$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,],
$config->addMiddleware([\App\Http\Middleware\CheckAdminRole::class,]);
$config->addMiddleware([\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.
Socialite
Для удобства можно связать аккаунт с социальными сетями и упростить процесс аутентификации.
В основе этого функционала - пакет Laravel Socialite.
Убедитесь, что он у вас установлен и настроен.
Далее установите пакет для интеграции Socialite
в MoonShine:
composer require moonshine/socialite
composer require moonshine/socialite
Выполните миграции:
php artisan migrate
php 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-factor
composer require moonshine/two-factor
Далее выполните миграции:
php artisan migrate
php artisan migrate
Далее добавьте authPipeline
:
use MoonShine\TwoFactor\TwoFactorAuthPipe;return [// ...'auth' => [// ...'pipelines' => [TwoFactorAuthPipe::class],]];
use MoonShine\TwoFactor\TwoFactorAuthPipe;return [// ...'auth' => [// ...'pipelines' => [TwoFactorAuthPipe::class],]];
use MoonShine\TwoFactor\TwoFactorAuthPipe;$config->authPipelines([TwoFactorAuthPipe::class]);
use MoonShine\TwoFactor\TwoFactorAuthPipe;$config->authPipelines([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
на страницу профиля, но если вы её переопределили и используете собственную, то добавьте компонент самостоятельно.
use MoonShine\TwoFactor\ComponentSets\TwoFactor;protected function components(): iterable{return [// ...TwoFactor::make(),];}
use MoonShine\TwoFactor\ComponentSets\TwoFactor;protected function components(): iterable{return [// ...TwoFactor::make(),];}
JWT
MoonShine также предоставляет простой способ переключить панель администратора в режим API
и взаимодействовать через токены.
Подробнее читайте в разделе API.