Bird
Raised Fist0
Firebasecloud~30 mins

Realtime Database security rules in Firebase - Mini Project: Build & Apply

Choose your learning style10 modes available
Realtime Database Security Rules
📖 Scenario: You are building a simple chat app using Firebase Realtime Database. You want to make sure that users can only read and write their own messages to keep conversations private and secure.
🎯 Goal: Create Firebase Realtime Database security rules that allow users to read and write only their own messages under the /messages/{userId} path. Users should not access other users' messages.
📋 What You'll Learn
Create a root rules object
Allow read and write only if the authenticated user's UID matches the {userId} in the database path
Deny all other access
💡 Why This Matters
🌍 Real World
Realtime Database security rules protect user data in apps like chat, social media, and collaboration tools.
💼 Career
Understanding and writing security rules is essential for Firebase developers and cloud engineers to secure data and comply with privacy requirements.
Progress0 / 4 steps
1
Create the root rules object
Create a root rules object with an empty messages child object in the Firebase Realtime Database security rules.
Firebase
Hint

Start by defining the rules object and add an empty messages child object inside it.

2
Add a wildcard {userId} under messages
Inside the messages object, add a wildcard key called {userId} to represent each user's message node.
Firebase
Hint

Use curly braces {} to define a wildcard key for user IDs.

3
Add read and write rules to allow only the authenticated user
Inside the {userId} object, add .read and .write rules that allow access only if auth != null and auth.uid == userId.
Firebase
Hint

Use auth.uid == userId to check if the user is accessing their own data.

4
Deny all other access by default
Add a default rule at the root level to deny all reads and writes that do not match the above rules.
Firebase
Hint

Set .read and .write to false at the root to deny all other access.

Practice

(1/5)
1. What is the main purpose of Firebase Realtime Database security rules?
easy
A. To control who can read or write data in the database
B. To speed up database queries
C. To backup the database automatically
D. To create database indexes

Solution

  1. Step 1: Understand the role of security rules

    Security rules are designed to protect data by controlling access permissions.
  2. Step 2: Identify the correct purpose

    They do not affect speed, backups, or indexing but focus on access control.
  3. Final Answer:

    To control who can read or write data in the database -> Option A
  4. Quick Check:

    Access control = To control who can read or write data [OK]
Hint: Security rules control access, not speed or backups [OK]
Common Mistakes:
  • Confusing security rules with database performance features
  • Thinking rules create backups automatically
  • Assuming rules manage indexing
2. Which of the following is the correct syntax to allow read access only to authenticated users in Firebase Realtime Database rules?
easy
A. "read": "user != null"
B. "read": "auth != null"
C. "read": "auth == null"
D. "read": "auth === true"

Solution

  1. Step 1: Recall the correct auth check syntax

    Firebase uses auth != null to check if a user is signed in.
  2. Step 2: Compare options

    "read": "auth != null" uses the correct syntax. Options A and B use wrong variables or conditions. "read": "auth === true" uses invalid comparison.
  3. Final Answer:

    "read": "auth != null" -> Option B
  4. Quick Check:

    Authenticated check = auth != null [OK]
Hint: Use auth != null to check signed-in users [OK]
Common Mistakes:
  • Using 'user' instead of 'auth'
  • Checking auth == null instead of auth != null
  • Using triple equals (===) which is invalid in rules
3. Given the following rule snippet, what will happen if a user tries to write data to /messages when they are not authenticated?
{
  "rules": {
    "messages": {
      ".write": "auth != null"
    }
  }
}
medium
A. The write will be allowed only if the user is authenticated
B. The write will be allowed for all users
C. The write will be denied for all users
D. The write will cause a syntax error

Solution

  1. Step 1: Analyze the write condition

    The rule states .write": "auth != null", meaning only authenticated users can write.
  2. Step 2: Consider unauthenticated user case

    If the user is not authenticated, auth == null, so write is denied.
  3. Final Answer:

    The write will be allowed only if the user is authenticated -> Option A
  4. Quick Check:

    auth != null allows writes only for signed-in users [OK]
Hint: auth != null means only signed-in users can write [OK]
Common Mistakes:
  • Thinking unauthenticated users can write
  • Confusing read and write rules
  • Assuming syntax error without checking code
4. Identify the error in this Firebase Realtime Database rule snippet:
{
  "rules": {
    "users": {
      ".read": "auth != null",
      ".write": "auth.id == auth.uid"
    }
  }
}
medium
A. The write rule should use 'auth.uid != null'
B. The read rule should be 'auth == null' to allow access
C. The rules object is missing a closing brace
D. The write rule uses 'auth.id' which is incorrect

Solution

  1. Step 1: Check the write rule syntax

    The write rule uses auth.id, but the correct property is auth.uid.
  2. Step 2: Verify other parts

    The read rule is correct to allow authenticated users. The braces are balanced. The write rule should compare auth.uid.
  3. Final Answer:

    The write rule uses 'auth.id' which is incorrect -> Option D
  4. Quick Check:

    Use auth.uid, not auth.id [OK]
Hint: Use auth.uid for user ID, not auth.id [OK]
Common Mistakes:
  • Using wrong property name 'auth.id'
  • Changing read rule incorrectly
  • Assuming syntax error due to braces
5. You want to allow users to read and write only their own profile data stored under /users/{userId}. Which rule correctly enforces this?
hard
A. { "rules": { "users": { ".read": "auth.uid == $userId", ".write": "auth.uid == $userId" } } }
B. { "rules": { "users": { "$userId": { ".read": "auth != null", ".write": "auth != null" } } } }
C. { "rules": { "users": { "$userId": { ".read": "auth != null && auth.uid == $userId", ".write": "auth != null && auth.uid == $userId" } } } }
D. { "rules": { "users": { "$userId": { ".read": "true", ".write": "true" } } } }

Solution

  1. Step 1: Understand the requirement

    Users should only access their own data under /users/{userId}.
  2. Step 2: Check each option

    { "rules": { "users": { "$userId": { ".read": "auth != null && auth.uid == $userId", ".write": "auth != null && auth.uid == $userId" } } } } correctly checks that the authenticated user's ID matches the path variable $userId for both read and write. { "rules": { "users": { "$userId": { ".read": "auth != null", ".write": "auth != null" } } } } allows any authenticated user to access all profiles. { "rules": { "users": { ".read": "auth.uid == $userId", ".write": "auth.uid == $userId" } } } uses $userId outside its scope. { "rules": { "users": { "$userId": { ".read": "true", ".write": "true" } } } } allows everyone access.
  3. Final Answer:

    { "rules": { "users": { "$userId": { ".read": "auth != null && auth.uid == $userId", ".write": "auth != null && auth.uid == $userId" } } } } -> Option C
  4. Quick Check:

    auth.uid == $userId restricts access to own data [OK]
Hint: Match auth.uid with $userId in path for user-specific access [OK]
Common Mistakes:
  • Allowing all authenticated users access to all profiles
  • Using variables outside their scope
  • Setting rules to true allowing public access
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard