Стражи аутентификации Guards
Стражи guards определяют, как происходит процесс аутентификации в вашем приложении. Imhotep предоставляет несколько готовых стражей для различных сценариев использования.
Каждый страж реализует интерфейс Imhotep\Contracts\Auth\Guard и отвечает за:
- Получение текущего пользователя
- Проверку учетных данных
- Управление состоянием аутентификации
Session Guard
Использует сессии для хранения информации об аутентификации. Идеально подходит для веб-приложений, потому что:
- Хранит ID пользователя в сессии
- Поддерживает функцию "запомнить меня"
- Использует куки для долговременной аутентификации
- Автоматически обновляет сессию при входе
Конфигурация
// config/auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
'remember' => 1209600, // Время жизни "запомнить меня" (секунды)
],
],
Token Guard
Использует токены для аутентификации. Подходит для API и мобильных приложений.
Конфигурация
// config/auth.php
'guards' => [
'api' => [
'driver' => 'token',
'provider' => 'users',
'input_key' => 'api_token', // Ключ для поиска токена
'storage_key' => 'api_token', // Поле в БД для токена
'hash' => false, // Хранить токен в хешированном виде
],
],
Request Guard
Позволяет реализовать кастомную логику аутентификации через замыкание.
Конфигурация
// config/auth.php
'guards' => [
'custom' => [
'driver' => 'custom',
'provider' => 'users',
],
],
// app/Providers/AppServiceProvider.php
use Imhotep\Facades\Auth;
use Imhotep\Auth\Guards\RequestGuard;
Auth::extend('custom', function ($app, $config) {
return new RequestGuard(function ($request, $provider) {
// Ваша логика получения пользователя
$token = $request->header('X-Custom-Token');
if ($token) {
return $provider->getByCredentials(['token' => $token]);
}
return null;
});
});
Certificate Guard
Аутентификация по SSL-сертификатам. Идеально для корпоративных систем и банковских приложений.
// config/auth.php
'guards' => [
'cert' => [
'driver' => 'certificate',
'provider' => 'cert_users',
'identifier_field' => 'email', // Поле для идентификации
],
],
В настройках nginx необходимо добавить:
server {
listen 443 ssl; # Сервер должен поддерживать https
server_name example.local;
root /var/www/public;
ssl_verify_client on; # Проверка сертификата включена всегда
ssl_client_certificate /etc/nginx/ssl/ca.crt; # Укажите путь к CA
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
keepalive_timeout 70;
// ...
}
Создание собственного стража
Для создания собсвтенного стража реализуй интерфейс Imhotep\Contracts\Auth\Guard. Все стражи используют трейт GuardHelpers, который реализует базовый функционал.
namespace App\Auth\Guards;
use Imhotep\Contracts\Auth\Guard;
use Imhotep\Contracts\Config\IConfigRepository;
use Imhotep\Auth\Guards\GuardHelpers;
class CustomGuard implements Guard
{
use GuardHelpers;
public function __construct(
protected string $name,
protected IConfigRepository $config
) {}
public function user(): mixed
{
if (!is_null($this->user)) {
return $this->user;
}
// Ваша логика получения пользователя
$token = $this->request->header('X-Custom-Token');
if (! empty($token)) {
$this->user = $this->provider->getByCredentials([
'token' => $token
]);
}
return $this->user;
}
public function validate(array $credentials = []): bool
{
$user = $this->provider->getByCredentials($credentials);
if ($user && $this->provider->validateCredentials($user, $credentials)) {
$this->setUser($user);
return true;
}
return false;
}
}
После написания стража, зарегистрируйте его в сервис провайдере:
// app/Providers/AppServiceProvider.php
use Imhotep\Facades\Auth;
use App\Auth\Guards\CustomGuard;
class AuthServiceProvider extends ServiceProvider
{
public function boot(): void
{
Auth::extendGuard('custom', function ($name, $config) {
return new CustomGuard($name, $config);
});
}
}