כל מנהל משויך לקבוצה, וקבוצה מגדירה לאילו פאנלים ופעולות יש לה גישה. ההחלטה מתקבלת בשני מקומות: 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. סדר ההחלטה:
- למנהל אין קבוצה:
false. perms == "-1":true.- הפאנל לא קיים ב-
CRM_adminPanel_panels:trueאם לקבוצה יש את הפאנלwizzo_market, אחרת נבדקmarket_panelsשל הקבוצה, ואם אין התאמהfalse. - הפאנל לא מופיע ברשימת הקבוצה:
false. - פעולה ראשית (
indexאו ריקה): כש-$permריק התוצאהtrue; אחרת צריך$found_page[$perm] === true. - פעולה אחרת: אם אין לה שורה ב-
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")) {
// כפתור "אשר" מוצג רק לקבוצות שסומנו
}
ראו גם#
- התחברות, סשנים ו-WIZZO ID
- בניית פאנל חדש: רישום הפאנל בטבלה
- panel_table: פעולות ועמודות עם
perms - טפסים: שדות עם
perms - מודל האבטחה