DATABASE & STORAGE

Supabase & PostgreSQL NEW

Definition: Row Level Security (RLS) is a feature of PostgreSQL that allows database administrators to control which rows a user can access based on their authentication token.

ডেভেলপারদের মাঝে একটি ভুল ধারণা আছে যে, Supabase হলো "Firebase এর ক্লোন"। কিন্তু আসলে Supabase এর কোর হলো একটি সম্পূর্ণ Relational PostgreSQL Database। এর সবচেয়ে পাওয়ারফুল ফিচার হলো RLS, যা আপনার ডাটাবেসকে হ্যাকারদের থেকে ১০০% সুরক্ষিত রাখে।

1. The Zero-Trust Architecture

The API Bypass Problem

সাধারণত আমরা আমাদের Node.js ব্যাকএন্ডে (API লেভেলে) ইউজার লগ-ইন করেছে কি না তা চেক করি। কিন্তু কোনো হ্যাকার যদি API কে বাইপাস করে সরাসরি আপনার ডাটাবেস ইউআরএলে (Database URL) হিট করে? তখন ডাটাবেস কিন্তু জানে না এই ব্যক্তি অথোরাইজড কি না!

The RLS Solution: Supabase-এ আমরা সিকিউরিটি লজিক Node.js-এ না লিখে, সরাসরি PostgreSQL ডাটাবেসের ভেতরে SQL দিয়ে লিখে দিই। একে বলে Zero-Trust Architecture। এখন কেউ API বাইপাস করে সরাসরি ডাটাবেসে হিট করলেও, ডাটাবেস ইঞ্জিন নিজেই ইউজারের JWT টোকেন চেক করবে। টোকেন ইনভ্যালিড হলে ডাটাবেস একটি Row (ডেটা) ও রিটার্ন করবে না!

Application-Level Security

  • সিকিউরিটি লজিক শুধু সার্ভার কোডে থাকে।
  • API এ কোনো বাগ (Bug) থাকলে পুরো ডাটাবেস কম্প্রোমাইজড হয়ে যায়।

Database-Level Security (RLS)

  • ডাটাবেস ইঞ্জিন নিজেই সিকিউরিটি হ্যান্ডেল করে।
  • ফ্রন্টএন্ড (React) থেকে সরাসরি ডাটাবেসে কোয়েরি করা ১০০% সেইফ!

2. Secure File Upload Implementation

নিচে দেখুন কিভাবে আমরা প্রথমে SQL দিয়ে পলিসি তৈরি করি, যেন শুধু লগ-ইন করা ইউজারই ছবি আপলোড করতে পারে। এরপর ক্লায়েন্ট সাইড (Javascript SDK) দিয়ে সরাসরি স্টোরেজ বাকেটে ফাইল পুশ করা হয়।

PostgreSQL RLS Policy
CREATE POLICY "Allow authenticated users to upload avatars"
ON storage.objects FOR INSERT
WITH CHECK (
    bucket_id = 'avatars' 
    AND auth.role() = 'authenticated'
);
uploadService.js
import { supabase } from './supabaseClient';

export async function uploadAvatar(file) {
    // Database engine will reject this if auth token is missing!
    const { data, error } = await supabase
        .storage
        .from('avatars')
        .upload(`public/${file.name}`, file);

    if (error) throw error;
    return data;
}

3. Live RLS Validation Simulator

উপরে লেখা SQL পলিসিটি বাস্তবে কীভাবে কাজ করে, তা দেখতে নিচের ডেমোটি ট্রাই করুন। লগ-আউট থাকা অবস্থায় ফাইল আপলোড করার চেষ্টা করুন, দেখবেন ডাটাবেস ইঞ্জিন আপনাকে ব্লক করে দিয়েছে!

Session State: Anonymous (Logged Out)

Upload Profile Avatar

Click to push payload directly to PostgreSQL Storage Bucket