Безопасность

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

Основы

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

Конфигурация

Основные настройки аутентификации находятся в файле конфигурации config/moonshine.php в секции auth.

'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,
]);

Отключение аутентификации

Если вы хотите отключить встроенную аутентификацию MoonShine, вы можете сделать это в MoonShineServiceProvider.

$config->authDisable();

Кастомная модель пользователя

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

'auth' => [
'model' => App\Models\Admin::class,
],

Кастомные поля пользователя и профиль

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

$config
->userField('username', 'login')
->userField('password', 'pass')
->userField('name', 'full_name')
->userField('avatar', 'profile_image');

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

'pages' => [
'profile' => 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);
}
}

Добавление middleware в конфигурацию

'middleware' => [
// ... other middleware
\App\Http\Middleware\CheckAdminRole::class,
],
$config->addMiddleware([
\App\Http\Middleware\CheckAdminRole::class,
]);

Аутентификационные pipelines

Аутентификационные pipelines в MoonShine позволяют добавлять дополнительные проверки и действия в процесс аутентификации после успешной проверки логина и пароля.

Настройка pipelines

'auth' => [
// ...
'pipelines' => [
// ...
],
],
$config->authPipelines([
\App\MoonShine\AuthPipelines\TwoFactorAuthentication::class,
\App\MoonShine\AuthPipelines\PhoneVerification::class,
]);

Создание pipeline

Например, подтверждение входа по номеру телефона:

 namespaces
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

Выполните миграции:

php artisan migrate

Опубликуйте файл конфигурации:

php artisan vendor:publish --provider="MoonShine\Socialite\Providers\SocialiteServiceProvider"

Далее в конфиге config/moonshine-socialite.php установите доступные драйверы и изображение для кнопки.

return [
'drivers' => [
'github' => '/images/github.png',
'facebook' => '/images/facebook.svg',
],
];

Драйверы должны быть заранее настроены в пакете Socialite.

Добавьте трейт MoonShine\Socialite\Traits\HasMoonShineSocialite к модели, которая отвечает за пользователей админ. панели (по умолчанию это MoonshineUser).

Не забудьте опубликовать модель, если используете конфигурацию по умолчанию:

 namespaces
namespace App\Models;
 
use MoonShine\Socialite\Traits\HasMoonShineSocialite;
 
final class MoonshineUser extends \MoonShine\Laravel\Models\MoonshineUser
{
use HasMoonShineSocialite;
}

И заменить в файле конфигурации:

'auth' => [
// ...
'model' => \App\Models\MoonshineUser::class,
],

Мы автоматически добавим компонент SocialAuth на страницу профиля и LoginLayout, но если вы их переопределили и используете собственные, то добавьте компонент самостоятельно.

use MoonShine\Socialite\Components\SocialAuth;
 
protected function components(): iterable
{
return [
// ...
SocialAuth::make(profileMode: true),
];
}

Двухфакторная аутентификация

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

composer require moonshine/two-factor

Далее выполните миграции:

php artisan migrate

Далее добавьте authPipeline:

use MoonShine\TwoFactor\TwoFactorAuthPipe;
 
return [
// ...
'auth' => [
// ...
'pipelines' => [
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;
}

И заменить в файле конфигурации:

'auth' => [
// ...
'model' => App\Models\MoonshineUser::class,
],

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

use MoonShine\TwoFactor\ComponentSets\TwoFactor;
 
protected function components(): iterable
{
return [
// ...
TwoFactor::make(),
];
}

JWT

MoonShine также предоставляет простой способ переключить панель администратора в режим API и взаимодействовать через токены.

Подробнее читайте в разделе API.