60 lines
1.9 KiB
PHP
60 lines
1.9 KiB
PHP
<?php
|
|
// api/middleware.php
|
|
|
|
// Memulai session jika belum dimulai
|
|
if (session_status() === PHP_SESSION_NONE) {
|
|
// Pastikan session cookie aman dan hanya terakses lewat HTTP (mencegah XSS hijack)
|
|
ini_set('session.cookie_httponly', 1);
|
|
session_start();
|
|
}
|
|
|
|
/**
|
|
* Middleware untuk memvalidasi user yang login dan mencocokkan perannya (RBAC).
|
|
* Jika user belum login, akan mengembalikan 401 Unauthorized.
|
|
* Jika role user tidak ada dalam daftar role yang diizinkan, mengembalikan 403 Forbidden.
|
|
*
|
|
* @param array $allowedRoles Daftar role yang diizinkan (contoh: ['admin', 'petugas'])
|
|
* @return array Data user yang saat ini sedang login dari Session
|
|
*/
|
|
function requireAuth(array $allowedRoles = []): array
|
|
{
|
|
// Cek apakah ada data user di Session
|
|
if (!isset($_SESSION['user']) || !is_array($_SESSION['user'])) {
|
|
http_response_code(401);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => 'Unauthorized: Silakan login terlebih dahulu untuk mengakses fitur ini.'
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
$user = $_SESSION['user'];
|
|
|
|
// Cek kecocokan role (RBAC) jika list allowedRoles tidak kosong
|
|
if (!empty($allowedRoles) && !in_array($user['role'], $allowedRoles)) {
|
|
http_response_code(403);
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => 'Forbidden: Peran Anda (' . $user['role'] . ') tidak memiliki hak akses ke fitur ini.'
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
return $user;
|
|
}
|
|
|
|
/**
|
|
* Middleware Opsional untuk mendukung Guest Mode.
|
|
* Jika user login, akan mengembalikan data user.
|
|
* Jika belum login, akan mengembalikan null (sebagai Guest) dan proses tetap berlanjut.
|
|
*
|
|
* @return array|null Data user jika login, atau null jika guest
|
|
*/
|
|
function optionalAuth(): ?array
|
|
{
|
|
if (isset($_SESSION['user']) && is_array($_SESSION['user'])) {
|
|
return $_SESSION['user'];
|
|
}
|
|
return null;
|
|
}
|