We use auth.uid() in policies to check who is making a request. This helps keep data safe by allowing only the right users to access or change it.
Using auth.uid() in policies in Supabase
using (auth.uid() = user_id)
auth.uid() returns the unique ID of the logged-in user making the request.
You compare auth.uid() to a column in your table that stores the owner's user ID.
user_id in the profile table.using (auth.uid() = profile.user_id)
customer_id in the orders table.using (auth.uid() = orders.customer_id)
This policy allows users to read only their own profile data by checking if their logged-in ID matches the user_id column.
create policy "Users can select their own profiles" on profiles for select using (auth.uid() = user_id);
Make sure your table has a column that stores the user ID to compare with auth.uid().
If auth.uid() is null, the user is not logged in, so the policy denies access.
Test your policies carefully to avoid accidentally exposing data.
auth.uid() gives the current user's ID.
Use it in policies to allow users to access only their own data.
Always compare auth.uid() to a user ID column in your table.
Practice
What does auth.uid() represent in Supabase row-level security policies?
Solution
Step 1: Understand the purpose of
auth.uid()auth.uid()is a function that returns the unique identifier of the currently logged-in user in Supabase.Step 2: Identify what
It does not return server or table IDs, nor user email addresses directly.auth.uid()is notFinal Answer:
The current logged-in user's unique ID -> Option AQuick Check:
auth.uid() = current user ID [OK]
- Thinking auth.uid() returns email
- Confusing auth.uid() with table keys
- Assuming auth.uid() is server ID
Which of the following is the correct syntax to allow a user to select only their own rows in a table with a user_id column?
CREATE POLICY "Select own rows" ON my_table FOR SELECT USING ( ... );
Solution
Step 1: Check correct equality operator in policies
Supabase policies use single equals=for comparison, not double equals==.Step 2: Match
The correct way is to compare the table'suser_idwithauth.uid()user_idcolumn toauth.uid().Final Answer:
user_id = auth.uid() -> Option DQuick Check:
Use single = and compare user_id to auth.uid() [OK]
- Using double equals == in policy
- Comparing auth.uid() to email column
- Using current_user() instead of auth.uid()
Given this policy on orders table:
CREATE POLICY "Users can select own orders" ON orders FOR SELECT USING (user_id = auth.uid());
What happens if a user with auth.uid() = 'abc123' runs a query to select orders?
Solution
Step 1: Understand the policy condition
The policy allows selecting rows whereuser_idequals the current user's ID.Step 2: Apply the policy to the user's query
The user with ID 'abc123' will only see rows whereuser_idis 'abc123'.Final Answer:
They see only orders where user_id is 'abc123' -> Option AQuick Check:
Policy filters rows by user_id = auth.uid() [OK]
- Thinking user sees all rows
- Expecting syntax error from correct policy
- Assuming no rows are returned
Identify the error in this policy that aims to restrict updates to a user's own rows:
CREATE POLICY "Update own rows" ON profiles FOR UPDATE USING (user_id = auth.uid);
Solution
Step 1: Check the usage of auth.uid()
auth.uidis a function and must be called with parentheses:auth.uid().Step 2: Verify other parts of the policy
The operator=is correct, user_id is the right column, and policy names can have spaces.Final Answer:
Missing parentheses after auth.uid -> Option CQuick Check:
auth.uid() needs parentheses to call function [OK]
- Forgetting () after auth.uid
- Using == instead of = in policies
- Changing user_id to email incorrectly
You want to create a policy that allows users to update their own profile only if their email is verified. The profiles table has columns user_id and email_verified (boolean). Which policy condition correctly enforces this?
Solution
Step 1: Combine user ownership and email verification
The policy must check both that the row belongs to the user and that their email is verified.Step 2: Use AND to require both conditions
Using AND ensures bothuser_id = auth.uid()andemail_verified = truemust be true.Final Answer:
user_id = auth.uid() AND email_verified = true -> Option BQuick Check:
Use AND to combine user_id and email_verified checks [OK]
- Using OR instead of AND
- Checking email_verified = false
- Omitting user_id check
Ready to prove it?
Pass the test and this pattern moves unknown
