> ## Documentation Index
> Fetch the complete documentation index at: https://docs.base44.com/llms.txt
> Use this file to discover all available pages before exploring further.

# דוגמאות RLS

> תבניות מעשיות של Row-Level Security לסוגי אפליקציות נפוצים.

<Warning>
  דף זה הוא חלק ממיומנות של סוכן קידוד AI ונכתב לסוכנים, לא לבני אדם. לתיעוד Base44 הקריא לבני אדם, ראה את [תיעוד המפתחים](/developers).
</Warning>

# RLS Examples

תבניות מעשיות של Row-Level Security לסוגי אפליקציות נפוצים.

**חשוב:** Base44 RLS תומך ב:

* **אופרטורים לוגיים:** `$or`, `$and`, `$nor` לשילוב תנאים
* **אופרטורי שדה (עבור שדות `data.*`):** `$in`, `$nin`, `$ne`, `$all`
* **user\_condition:** Equality בלבד (ללא אופרטורים)

## תוכן

* [Simple Patterns (JSON Schema)](#simple-patterns-json-schema)
* [Using Operators](#using-operators)
* [Field-Level Security Examples](#field-level-security-examples)
* [Complex Patterns (Dashboard UI or Backend)](#complex-patterns-dashboard-ui-or-backend)
* [Best Practices](#best-practices)

***

## Simple Patterns (JSON Schema)

תבניות אלה עובדות עם פורמט RLS של סכמת JSON.

### Todo App - גישה לבעלים בלבד

משתמשים רואים ומנהלים רק את המשימות שלהם.

```jsonc theme={null}
{
  "name": "Task",
  "type": "object",
  "properties": {
    "title": { "type": "string" },
    "description": { "type": "string" },
    "completed": { "type": "boolean" },
    "priority": { "type": "string", "enum": ["low", "medium", "high"] },
    "due_date": { "type": "string", "format": "date" }
  },
  "rls": {
    "create": true,
    "read": { "created_by": "{{user.email}}" },
    "update": { "created_by": "{{user.email}}" },
    "delete": { "created_by": "{{user.email}}" }
  }
}
```

### טופס צור קשר - יצירה ציבורית, קריאה למנהלים בלבד

כל אחד יכול להגיש, רק מנהלים יכולים לצפות בהגשות.

```jsonc theme={null}
{
  "name": "ContactSubmission",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "email": { "type": "string", "format": "email" },
    "message": { "type": "string" }
  },
  "rls": {
    "create": true,
    "read": { "user_condition": { "role": "admin" } },
    "update": { "user_condition": { "role": "admin" } },
    "delete": { "user_condition": { "role": "admin" } }
  }
}
```

### פרופיל משתמש - ניהול עצמי

משתמשים יכולים לגשת רק לפרופיל שלהם.

```jsonc theme={null}
{
  "name": "UserProfile",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "avatar_url": { "type": "string" },
    "bio": { "type": "string" },
    "preferences": { "type": "object" }
  },
  "rls": {
    "create": true,
    "read": { "created_by": "{{user.email}}" },
    "update": { "created_by": "{{user.email}}" },
    "delete": { "created_by": "{{user.email}}" }
  }
}
```

### נתוני מחלקה - גישת מחלקה זהה

משתמשים יכולים לראות רק רשומות מהמחלקה שלהם.

```jsonc theme={null}
{
  "name": "DepartmentAnnouncement",
  "type": "object",
  "properties": {
    "title": { "type": "string" },
    "content": { "type": "string" },
    "department": { "type": "string" }
  },
  "rls": {
    "create": { "user_condition": { "role": "manager" } },
    "read": { "data.department": "{{user.data.department}}" },
    "update": { "user_condition": { "role": "manager" } },
    "delete": { "user_condition": { "role": "admin" } }
  }
}
```

### Subscription - מנוהל על ידי מנהל, קריא למשתמש דרך שדה email

```jsonc theme={null}
{
  "name": "Subscription",
  "type": "object",
  "properties": {
    "user_email": { "type": "string" },
    "tier": { "type": "string", "enum": ["free", "basic", "pro", "enterprise"] },
    "credits": { "type": "number" },
    "renewal_date": { "type": "string", "format": "date" }
  },
  "rls": {
    "create": { "user_condition": { "role": "admin" } },
    "read": { "data.user_email": "{{user.email}}" },
    "update": { "user_condition": { "role": "admin" } },
    "delete": { "user_condition": { "role": "admin" } }
  }
}
```

**הערה:** תבנית זו מאפשרת רק למשתמשים לקרוא את המנוי שלהם. מנהלים צריכים להשתמש בממשק המשתמש של Dashboard כדי להגדיר גישת קריאה נוספת לעצמם.

### נתונים פרטיים - לבעלים בלבד

```jsonc theme={null}
{
  "name": "PrivateNotes",
  "type": "object",
  "properties": {
    "title": { "type": "string" },
    "content": { "type": "string" },
    "tags": { "type": "array", "items": { "type": "string" } }
  },
  "rls": {
    "create": true,
    "read": { "created_by": "{{user.email}}" },
    "update": { "created_by": "{{user.email}}" },
    "delete": { "created_by": "{{user.email}}" }
  }
}
```

### קריאה ציבורית, כתיבה מאומתת

כל אחד יכול לקרוא, רק משתמשים מחוברים יכולים ליצור/לערוך את הרשומות שלהם.

```jsonc theme={null}
{
  "name": "BlogPost",
  "type": "object",
  "properties": {
    "title": { "type": "string" },
    "content": { "type": "string" },
    "author_email": { "type": "string" }
  },
  "rls": {
    "create": true,
    "read": true,
    "update": { "created_by": "{{user.email}}" },
    "delete": { "created_by": "{{user.email}}" }
  }
}
```

***

## שימוש באופרטורים

### אופרטורים לוגיים

שלב מספר תנאים באמצעות `$or`, `$and`, או `$nor`:

**גישת Owner OR Admin:**

```jsonc theme={null}
{
  "name": "Document",
  "type": "object",
  "properties": {
    "title": { "type": "string" },
    "content": { "type": "string" }
  },
  "rls": {
    "create": true,
    "read": {
      "$or": [
        { "created_by": "{{user.email}}" },
        { "user_condition": { "role": "admin" } }
      ]
    },
    "update": {
      "$or": [
        { "created_by": "{{user.email}}" },
        { "user_condition": { "role": "admin" } }
      ]
    },
    "delete": { "user_condition": { "role": "admin" } }
  }
}
```

**מספר תפקידים עם \$or:**

```jsonc theme={null}
{
  "rls": {
    "read": {
      "$or": [
        { "user_condition": { "role": "admin" } },
        { "user_condition": { "role": "manager" } },
        { "user_condition": { "role": "hr" } }
      ]
    }
  }
}
```

### אופרטורי שדה לשדות data.\*

השתמש ב-`$in`, `$nin`, `$ne`, `$all` להשוואת שדות נתוני entity:

**גישה מבוססת תגים (\$in):**

```jsonc theme={null}
{
  "rls": {
    "read": {
      "data.category": { "$in": ["public", "shared"] }
    }
  }
}
```

**החרג סטטוסים ספציפיים (\$nin):**

```jsonc theme={null}
{
  "rls": {
    "read": {
      "data.status": { "$nin": ["archived", "deleted"] }
    }
  }
}
```

**לא שווה (\$ne):**

```jsonc theme={null}
{
  "rls": {
    "read": {
      "data.visibility": { "$ne": "private" }
    }
  }
}
```

**כל התגים חייבים להתאים (\$all):**

```jsonc theme={null}
{
  "rls": {
    "read": {
      "data.required_tags": { "$all": ["approved", "reviewed"] }
    }
  }
}
```

### שילוב אופרטורים לוגיים ואופרטורי שדה

```jsonc theme={null}
{
  "rls": {
    "read": {
      "$and": [
        { "data.status": { "$ne": "draft" } },
        {
          "$or": [
            { "created_by": "{{user.email}}" },
            { "data.visibility": "public" }
          ]
        }
      ]
    }
  }
}
```

***

## דוגמאות Field-Level Security

שלוט בגישה לשדות ספציפיים בתוך entity.

### שדה משכורת רגיש

```jsonc theme={null}
{
  "name": "Employee",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "email": { "type": "string", "format": "email" },
    "salary": {
      "type": "number",
      "description": "Annual salary",
      "rls": {
        "read": { "user_condition": { "role": "hr" } },
        "write": { "user_condition": { "role": "hr" } }
      }
    },
    "performance_notes": {
      "type": "string",
      "description": "Manager notes",
      "rls": {
        "read": {
          "$or": [
            { "user_condition": { "role": "manager" } },
            { "user_condition": { "role": "hr" } }
          ]
        },
        "write": { "user_condition": { "role": "manager" } }
      }
    }
  }
}
```

### שדות פנימיים למנהלים בלבד

```jsonc theme={null}
{
  "name": "Order",
  "type": "object",
  "properties": {
    "order_number": { "type": "string" },
    "total": { "type": "number" },
    "internal_notes": {
      "type": "string",
      "description": "Internal processing notes",
      "rls": {
        "read": { "user_condition": { "role": "admin" } },
        "write": { "user_condition": { "role": "admin" } }
      }
    },
    "profit_margin": {
      "type": "number",
      "description": "Profit margin percentage",
      "rls": {
        "read": { "user_condition": { "role": "admin" } },
        "write": false
      }
    }
  }
}
```

***

## Complex Patterns (Dashboard UI or Backend)

תבניות מסוימות עדיין עשויות לדרוש את ממשק המשתמש של Dashboard או פונקציות backend.

### יחסים דו-כיווניים (למשל, חברויות, התאמות)

**דרישה:** כל אחד מהצדדים ביחסים צריך גישה.

**כעת אפשרי עם \$or:**

```jsonc theme={null}
{
  "rls": {
    "read": {
      "$or": [
        { "data.user_a_email": "{{user.email}}" },
        { "data.user_b_email": "{{user.email}}" }
      ]
    }
  }
}
```

**פתרונות חלופיים:**

1. **עיצוב entity מחדש:** אחסן שתי רשומות ליחסים (אחת לכל צד)
2. **פונקציית backend:** שאילתה עם לוגיקה מותאמת

### לוגיקה עסקית מורכבת

**דרישה:** גישה תלויה במספר שדות entity עם תנאים מורכבים.

**מגבלת JSON Schema:** בעוד שאופרטורים עוזרים, לוגיקה עסקית מורכבת מאוד עדיין עשויה להיות קשה להביע.

**אפשרויות פתרון:**

1. **פונקציית backend:** ישם לוגיקת גישה מותאמת
2. **שילוב כללים פשוטים יותר:** פרק כללים מורכבים לכללים פשוטים יותר ברמת entity וברמת שדה

***

## שיטות עבודה מומלצות

### אסטרטגיית אבטחה

השתמש בשילוב של RLS ברמת entity ואבטחה ברמת שדה:

| סוג נתונים               | גישה                     | דוגמה                             |
| ------------------------ | ------------------------ | --------------------------------- |
| ניתן לעריכה על ידי משתמש | Entity RLS: לבעלים בלבד  | UserProfile עם בדיקת `created_by` |
| שדות רגישים              | Field-level RLS          | שדה Salary עם בדיקת תפקיד HR      |
| גישה למספר תפקידים       | `$or` עם user\_condition | גישת Admin OR Manager             |
| גישה מותנית              | אופרטורי שדה             | `$in`, `$ne` על שדות data         |
| תוכן ציבורי              | Entity RLS: `read: true` | PublicPost                        |
| תוכן פרטי                | Entity RLS: לבעלים בלבד  | PrivateNote                       |

### מתי להשתמש בכל גישה

| דרישה                                  | גישה                             |
| -------------------------------------- | -------------------------------- |
| תנאי יחיד (owner, admin, department)   | JSON Schema RLS                  |
| מספר תנאי OR/AND                       | JSON Schema RLS עם `$or`/`$and`  |
| בדיקות ערך שדה עם `$in`/`$ne`/וכו'     | JSON Schema RLS לשדות `data.*`   |
| בקרת גישה ברמת שדה                     | JSON Schema FLS (`rls` ברמת שדה) |
| אופרטורי השוואה מורכבים (`$gt`, `$lt`) | פונקציות backend                 |
| לוגיקה עסקית מורכבת מאוד               | פונקציות backend                 |

### תבניות תפקידים נפוצות

| תפקיד       | גישה טיפוסית                   |
| ----------- | ------------------------------ |
| `admin`     | גישה מלאה לכל הרשומות          |
| `moderator` | גישת read/update, delete מוגבל |
| `manager`   | גישה מוגבלת למחלקה             |
| `user`      | רק הרשומות שלו                 |

### סיכום אופרטורים נתמכים

| אופרטור                      | נתמך | הערות                   |
| ---------------------------- | ---- | ----------------------- |
| `$or`                        | כן   | שלב מספר תנאים          |
| `$and`                       | כן   | כל התנאים חייבים להתאים |
| `$nor`                       | כן   | אף אחד מהתנאים לא מתאים |
| `$in`                        | כן   | לשדות `data.*` בלבד     |
| `$nin`                       | כן   | לשדות `data.*` בלבד     |
| `$ne`                        | כן   | לשדות `data.*` בלבד     |
| `$all`                       | כן   | לשדות `data.*` בלבד     |
| `$gt`, `$lt`, `$gte`, `$lte` | לא   | השתמש בפונקציות backend |
| `$regex`                     | לא   | השתמש בפונקציות backend |

### סיכום מגבלות

| לא נתמך                        | חלופה                               |
| ------------------------------ | ----------------------------------- |
| אופרטורים על `user_condition`  | השתמש ב-equality בלבד לבדיקות משתמש |
| אופרטורי השוואה (`$gt`, `$lt`) | פונקציות backend                    |
| התאמת regex (`$regex`)         | פונקציות backend                    |
| יחסים בין entities             | פונקציות backend                    |

<Note>דף זה תורגם באמצעות בינה מלאכותית. למידע המדויק והעדכני ביותר, עיין ב[גרסה האנגלית](/). </Note>
