Вход на сайт
Аутентификация — проверка того, кто перед нами: посетитель вводит почту и пароль, сайт сверяет их и запоминает пользователя в сессии. В самом CodeIgniter готового входа нет. Его пишут сами — это небольшой контроллер — или ставят официальный пакет Shield.
Таблица и модель
Нужна таблица users со столбцами id, email и password. Создайте для неё миграцию и модель, как в главе о базе данных:
// app/Models/UserModel.php
namespace App\Models;
use CodeIgniter\Model;
class UserModel extends Model
{
protected $table = 'users';
protected $allowedFields = ['email', 'password'];
}Пароль нельзя хранить открытым текстом. В базу записывают его хеш — необратимо преобразованную строку. Первого пользователя добавьте сидером:
// app/Database/Seeds/UserSeeder.php, метод run()
$this->db->table('users')->insert([
'email' => 'anna@example.com',
'password' => password_hash('secret123', PASSWORD_DEFAULT),
]);Маршруты
// app/Config/Routes.php
$routes->get('login', 'Auth::form');
$routes->post('login', 'Auth::login');
$routes->get('logout', 'Auth::logout');Контроллер входа
Создайте контроллер командой php spark make:controller Auth:
// app/Controllers/Auth.php
namespace App\Controllers;
use App\Models\UserModel;
class Auth extends BaseController
{
public function form(): string
{
return view('auth/login');
}
public function login()
{
$user = model(UserModel::class)
->where('email', $this->request->getPost('email'))
->first();
$password = (string) $this->request->getPost('password');
if ($user === null || ! password_verify($password, $user['password'])) {
return redirect()->back()->with('error', 'Неверная почта или пароль');
}
session()->regenerate();
session()->set('user_id', $user['id']);
return redirect()->to('/posts');
}
public function logout()
{
session()->destroy();
return redirect()->to('/login');
}
}password_verify() сравнивает введённый пароль с хешем из базы. При успехе в сессию записывается user_id — по нему сайт узнаёт пользователя на следующих страницах.
Форма входа
<!-- app/Views/auth/login.php -->
<?= form_open('login') ?>
<p class="error"><?= esc(session()->getFlashdata('error')) ?></p>
<input type="email" name="email" placeholder="Почта">
<input type="password" name="password" placeholder="Пароль">
<button type="submit">Войти</button>
<?= form_close() ?>Откройте /login, введите anna@example.com и secret123 — сайт перейдёт на /posts. С неверным паролем форма откроется снова с сообщением об ошибке.
Закрытые страницы и текущий пользователь
Закрытые адреса защищает фильтр auth из прошлого урока: он проверяет user_id в сессии. Данные вошедшего пользователя читают из базы:
$user = model(UserModel::class)->find(session('user_id'));Shield
Для настоящего проекта надёжнее взять официальный пакет Shield:
composer require codeigniter4/shield
php spark shield:setupКоманда создаёт таблицы и настройки и подключает готовые страницы регистрации и входа. В нём уже есть сброс пароля, группы и права пользователей, токены для API. Текущего пользователя возвращает auth()->user(), а закрытые маршруты защищает фильтр session.
Частая ошибка
После проверки пароля идентификатор сессии нужно сменить, иначе злоумышленник, заранее подсунувший жертве известный ему идентификатор, окажется в её учётной записи. Вызывайте session()->regenerate() сразу после проверки пароля — до записи user_id в сессию.