Класс Authenticatable
Интерфейс Authenticatable определяет контракт, которому должны соответствовать модели пользователей для работы с системой аутентификации Laravel. Он содержит основные методы для получения идентификатора, пароля, имени пользователя и проверки запомненного состояния. Обычно этот интерфейс уже реализован в стандартной модели User, которая использует трейт Authenticatable.
Интерфейс требует реализации следующих методов: getAuthIdentifier возвращает уникальный идентификатор пользователя, getAuthPassword возвращает хешированный пароль, getRememberToken и setRememberToken управляют токеном запоминания, а getRememberTokenName возвращает имя поля для этого токена. Также есть метод getAuthIdentifierName, который возвращает имя поля с идентификатором.
Стандартная реализация
В Laravel модель User по умолчанию реализует интерфейс Authenticatable через трейт. Рассмотрим пример стандартной модели пользователя:
<?php
namespace AppModels;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;
class User extends Authenticatable
{
use Notifiable;
protected $fillable = [
'name',
'email',
'password',
];
protected $hidden = [
'password',
'remember_token',
];
}
?>
В этом примере модель расширяет базовый класс Authenticatable, который уже предоставляет реализацию всех необходимых методов интерфейса.
Использование методов интерфейса
Получим аутентифицированного пользователя и вызовем основные методы интерфейса:
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesAuth;
class UserController extends Controller
{
public function show()
{
$user = Auth::user();
if ($user) {
$id = $user->getAuthIdentifier();
$name = $user->getAuthIdentifierName();
$password = $user->getAuthPassword();
$rememberToken = $user->getRememberToken();
echo "ID: " . $id;
echo "Name field: " . $name;
echo "Remember token: " . $rememberToken;
}
}
}
?>
Результат выполнения кода для аутентифицированного пользователя:
"ID: 1"
"Name field: id"
"Remember token: xV3f9kL2pQ5sT8mN"
Создание своей модели с интерфейсом
Если необходимо создать свою модель, реализующую интерфейс Authenticatable, можно использовать трейт и переопределить необходимые методы:
<?php
namespace AppModels;
use IlluminateAuthAuthenticatable;
use IlluminateContractsAuthAuthenticatable as AuthenticatableContract;
use IlluminateDatabaseEloquentModel;
class Admin extends Model implements AuthenticatableContract
{
use Authenticatable;
protected $table = 'admins';
protected $fillable = [
'username',
'password_hash',
];
public function getAuthPassword()
{
return $this->password_hash;
}
}
?>
В этом примере мы переопределяем метод getAuthPassword, чтобы указать другое имя поля для пароля. Остальные методы наследуются из трейта Authenticatable.
Использование с провайдером
После создания своей модели необходимо настроить провайдер в конфигурации auth.php:
<?php
'providers' => [
'admins' => [
'driver' => 'eloquent',
'model' => AppModelsAdmin::class,
],
],
?>
Теперь можно использовать аутентификацию для модели Admin с помощью фасада Auth:
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesAuth;
class AdminController extends Controller
{
public function dashboard()
{
$admin = Auth::guard('admins')->user();
if ($admin) {
$id = $admin->getAuthIdentifier();
$username = $admin->username;
echo "Admin ID: " . $id;
echo "Username: " . $username;
} else {
echo "Not authenticated";
}
}
}
?>
Результат выполнения кода:
"Admin ID: 5"
"Username: john_doe"