Bu işin çok çeşitli yolları var.

En basiti. Erişim seviyesidir.

kullanıcı tablonda erişim seviyesi diye bir int oluştur.

Adminler 2
Yarım adminler 4
Çeyrek adminler 8
Soğan cücükleri 16

böyle katlanarak gider. aralarda boşluk bilerek var yarın ikisi arasında bir şey çıkarsa diye.

Niye 0 1 kullanmıyouz ? true false karışmasın diye.

sessionda erisimSeviyesi diye tutarsın

switch($_SESSION['erisimSeviyesi']) {
case 1:
include("admin_menu.php");
break;
case 2:
include("yarim_admin_menu.php");
break;
}


Yetermi ? yetmez.

Yapılacak işlem minimum hangi yetkiyi istiyorsa ona göre erişim verirsin.
yani diyelim bir işi çeyrek admin seviyesi kurtarıyor


try {
if($_SESSION['erisimSeviyesi'] > 8) {
throw new exception("yetersiz erişim seviyesi");
}
// artık ne işin varsa buraya yazıyorsun
} catch(Exception $e) {
echo $e->getMessage();
return false;
}


Niye try catch kullanıyoruz, iflerin elselerin suyumu çıktı ?

Yok. bu bir yazılım modeli, biz buna def-i bela diyelim.
Önce gereklilikleri kontrol ediyorsun ki kodun daha sade görünsün.

Bu model dikkatli tasarlanırsa, bayaa su kaldırır. kullanımı basittir. kullanıcıların yetki seviyesi kolayca değiştirilebilir.

Sorunu bir işin birden fazla yetki seviyesinde yapılması istendiğinda zaman zaman kodun duplikasyonu gerekebiliyor. Ancak buda düzgün class yapısı kurularak kolayca aşılır.

JSON bir data saklama ve transfer formatıdır. php den mesela javascripte karmaşık veri kümeleri aktarırken iyidir. Senin durumunda kullanmak için bir neden göremiyor.

Eğer daha karmaşık yetkilendirme modelleri istersen bunları Laravel gibi frameworklerde bulabilirsin. Ancak bunların uygulaması zor ve çetrefillidir. Gerekmiyorsa kullanma.