הרשאות בפאנל הניהול

איך הפאנל מחליט מי רשאי להיכנס לפאנל ולפעולה: קבוצות מנהלים, ADMIN::has_perms, הערך -1, skip_permission_check, perm_developer והרשאות נוספות של פאנל.

⏱ 5 דק' קריאה 810 מילים ערוך דף זה ב-GitHub

כל מנהל משויך לקבוצה, וקבוצה מגדירה לאילו פאנלים ופעולות יש לה גישה. ההחלטה מתקבלת בשני מקומות: AdminModule::GetPageContent בודק את הכניסה לפאנל לפני שהוא יוצר את המחלקה שלו, ו-ADMIN::has_perms() זמינה לכם בקוד הפאנל לבדיקות פרטניות (למשל הצגת כפתור מחיקה). בדף הזה מתואר מבנה ההרשאות, סדר ההחלטה, ואיך לבקש הרשאה מותאמת בפאנל חדש.

איפה ההרשאות נשמרות#

הקבוצות נמצאות בטבלה CRM_adminPanel_admins_groups, ושיוך מנהל לקבוצה הוא CRM_adminPanel_admins.group_id. עמודת perms של הקבוצה מכילה אחד משניים:

  • "-1": מנהל על, הכול מותר.
  • JSON עם רשימת פאנלים:
[
  {
    "id": 12,
    "checked": true,
    "edit": true,
    "delete": false,
    "export": true,
    "publish": false,
    "subs": [
      { "id": 40, "checked": true, "edit": true }
    ],
    "market_panels": []
  }
]

id הוא המזהה של הפאנל ב-CRM_adminPanel_panels, ו-subs הם פעולות משנה מהטבלה CRM_adminPanel_panels_options (למשל insert). השדות edit, delete, export, publish הם ההרשאות הרגילות; מחרוזות הרשאה שנמצאות בשימוש בליבה: ריק (גישה בסיסית), edit, delete, export, import, show_all, publish.

מסך ההרשאות של קבוצה נמצא ב-{admin}/Admins/perms/<groupId> ונשמר ב-POST {admin}/Admins/save_group?id=<groupId>.

שימו לב
save_group שומרת כל JSON שנשלח אליה ולא מאמתת את המבנה. רק מנהל שיש לו הרשאה לפאנל Admins יכול להגיע אליה, אבל זה בדיוק הפאנל שצריך לשמור צר: הענקת הגישה אליו שקולה להענקת כל ההרשאות.

ADMIN::has_perms#

static function has_perms($perm = "", $curr_page = false, $curr_action = false)
פרמטרמשמעות
$permההרשאה הנבדקת: "" (גישה בסיסית), "edit", "delete", "export" ועוד
$curr_pageשם הפאנל. ברירת מחדל: $_GET["module"]
$curr_actionשם הפעולה (pname). ברירת מחדל: $_GET["pname"]

החזרה: bool. סדר ההחלטה:

  1. למנהל אין קבוצה: false.
  2. perms == "-1": true.
  3. הפאנל לא קיים ב-CRM_adminPanel_panels: true אם לקבוצה יש את הפאנל wizzo_market, אחרת נבדק market_panels של הקבוצה, ואם אין התאמה false.
  4. הפאנל לא מופיע ברשימת הקבוצה: false.
  5. פעולה ראשית (index או ריקה): כש-$perm ריק התוצאה true; אחרת צריך $found_page[$perm] === true.
  6. פעולה אחרת: אם אין לה שורה ב-panels_options, התוצאה true. אם יש, היא חייבת להופיע ב-subs של הקבוצה, ואם $perm לא ריק גם הדגל המתאים ב-sub חייב להיות מופעל.

דוגמה: בדיקה ידנית בתוך מתודה של פאנל לפני פעולת מחיקה.

// panel_table מוסיף פעולת מחיקה קבוצתית רק כשמוגדר delete וגם
// ADMIN::has_perms("delete") נכון. בדיקה ידנית בקוד שלכם:
if (!ADMIN::has_perms("delete")) {
    return "אין הרשאה";
}
שימו לב

שני מצבים בהחלטה מחזירים true בלי הרשאה מפורשת: פעולה שאין לה שורה ב-panels_options (כלומר מתודה ציבורית שלא נרשמה), ופאנל שלא קיים בטבלה בקבוצה שיש לה את wizzo_market. לכן מתודה ציבורית חדשה בפאנל שמגנה על נתונים חייבת לבדוק ADMIN::has_perms("edit") בעצמה. insert() ו-save() של טופס לא בודקים הרשאת עריכה אוטומטית.

כניסה לפאנל: GetPageContent#

לפני שנוצרת המחלקה ADMINMODULE_<name>, AdminModule::GetPageContent דוחה את הבקשה ב-404 (ERRORPAGE, ראו עמודי שגיאה) אם:

  • הפאנל אינו home, אינו מסומן skip_permission_check, ואין לו שורה ב-CRM_adminPanel_panels או ש-ADMIN::has_perms() מחזירה false;
  • perm_developer = 1 והמנהל אינו מפתח (ADMIN::is_developer(), ראו התחברות).

אין הודעת "אין הרשאה": הדפדפן מופנה ל-/404 (בקשות AI מקבלות גוף JSON וכותרת AI-Error).

דילוג על בדיקת הרשאות: skip_permission_check#

פאנל שרוצה להיות נגיש לכל מנהל מחובר מגדיר מאפיין במחלקה. AdminModule קורא אותו עם get_class_vars, ולכן גם מאפיין סטטי וגם מאפיין ציבורי רגיל עובדים:

class ADMINMODULE_my_dashboard extends bgl_controller
{
    static $skip_permission_check = true;

    public function index()
    {
        return "מוצג לכל מנהל מחובר";
    }
}

בליבה נעשה בזה שימוש ב-admin_chat, admin_countries, ai_chat, chat_actions, error_log, newpage_media, poolse_media, server_load, storage, target_media ו-todo.

שימו לב
skip_permission_check מוותר על ADMIN::has_perms(), כלומר כל מנהל מחובר נכנס. אם הפאנל מבצע פעולה רגישה, בדקו בתוכו ADMIN::is_developer() או ADMIN::has_perms() במפורש. שער perm_developer של GetPageContent פועל רק כשיש לפאנל שורה ב-CRM_adminPanel_panels, ולכן file_manager בודק ADMIN::is_developer() גם ב-__construct ומחזיר 403.

perm_developer: פאנל למפתחים בלבד#

עמודת perm_developer ב-CRM_adminPanel_panels מסמנת פאנל שרק מי שנחשב מפתח רואה, וגם הוא לא מופיע בתפריט לאחרים. את הדגל מגדירים בטופס הפאנל ב-PanelList (השדה מוצג רק למפתחים). פאנלים כמו composer, Params, PanelList ו-Admins מתייחסים ל-ADMIN::is_developer() גם בתוך הקוד.

הרשאות נוספות לפאנל: extra_perms#

פאנל יכול להגדיר הרשאות משלו מעבר לסט הרגיל. הן נכתבות בעמודה extra_perms בפורמט |a||b| (בטופס הפאנל ב-PanelList זה שדה Tags), ומופיעות במסך ההרשאות של הקבוצה תיבות נוספות לסימון (תיבות סימון ליד הפאנל), ובשמירה נכתבות כדגל בשם ההרשאה בפריט הפאנל ב-JSON. הבדיקה בקוד זהה:

if (ADMIN::has_perms("approve")) {
    // כפתור "אשר" מוצג רק לקבוצות שסומנו
}

ראו גם#

מצאתם טעות או חוסר? תקנו את הדף או פתחו Issue בריפו. התיעוד נכתב מתוך הקוד של ליבה 5.0.115.