Thuta Learning
Cloud Providers & Platforms
IntermediateDevOps & Toolsintermediate

Supabase

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Supabase concept ကို နားလည်ရှင်းပြနိုင်ရန်
  • Diagram/table ကို ဖတ်ပြီး platform/provider category တွေ ဘယ်လို ကွာခြားသလဲ ခြေရာခံနိုင်ရန်
  • ကိုယ့် project အတွက် ဘယ် platform category ကို ဘယ်လို ရွေးချယ်သင့်သလဲ ရှင်းပြနိုင်ရန်

နားလည်ထားရမယ့် အချက်

Supabase ရဲ့ ပုံသဏ္ဌာန်: အဓိကမှာ standard Postgres database ရှိပြီး Supabase က schema ကနေ တိုက်ရိုက် API generate လုပ်ပေးလို့ basic CRUD အတွက် backend layer ကိုယ်တိုင်ရေးစရာမလိုပါ။

  • ပေါင်းစည်းထားသော service အနေနဲ့ Authentication
  • Policy-based access ပါသော File storage
  • Database change များကို Realtime subscription
  • Custom logic အတွက် Serverless function

Architecture: Frontend/Backend -> Supabase, row-level security ပါသော Postgres database, Auth, Storage ဆီ ကွဲထွက်သွားပါတယ်။

Row-level security ဆိုတာ request တောင်းဆိုသူ ဘယ်သူလဲဆိုတာအပေါ်မူတည်ပြီး database ကိုယ်တိုင်က row ဘယ်တွေကို ကြည့်ခွင့်/ပြင်ခွင့်ရှိသလဲ enforce လုပ်ခြင်းဖြစ်ပြီး application code က ဘာပြမလဲ ဆုံးဖြတ်ခြင်း တစ်ခုတည်းမဟုတ်ပါ။

ဒါနှင့်အတူ တကယ့် critical ခွဲခြားချက်တစ်ခု ရှိပါတယ် -- client-accessible key တွေကို row-level security က ကန့်သတ်ထားပြီး server-only secret key တွေကတော့ ဒါကို လုံးဝ ကျော်လွှားနိုင်ပါတယ်။

Row-Level Security
Query တစ်ခုကို ဘယ်သူတောင်းဆိုသလဲဆိုတာအပေါ်မူတည်ပြီး row တစ်ခုချင်းစီအလိုက် access rule ကို database level မှာ enforce လုပ်ပေးတဲ့ security feature ဖြစ်ပြီး application code သာမက database ကိုယ်တိုင်က query တစ်ခုက ဘယ် row တွေကို မြင်နိုင်/ပြောင်းလဲနိုင်လဲဆိုတာကို ထိန်းချုပ်ပေးသည်။
text
SUPABASE ARCHITECTURE
---------------------
                     +----------------------------+
                     |          Supabase          |
Frontend / Backend ->|  Postgres DB (Row-Level    |
                     |  Security) | Auth | Storage |
                     +----------------------------+

လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်

Client-accessible key ကို frontend code ထဲ ထားလို့ ရတာက row-level security policy တွေက ဒါနဲ့ ကြည့်/ပြောင်းနိုင်တာကို ကန့်သတ်ပေးလို့ပါ -- policy မှန်ကန်စွာ configure ထားမှသာ ဖြစ်ပါတယ်။

Service-role (သို့) secret key ကတော့ policy အားလုံးကို လုံးဝကျော်လွှားပြီး authorization check ကိုယ်တိုင်လုပ်ပြီးသား trusted server-side code အတွက်သာ ရည်ရွယ်ပါတယ်။

ပိတ်ထားခြင်းဖြင့် စတင်ပါ

Table အသစ်တိုင်းရဲ့ default access ကို client-accessible key ဘယ်ဟာအတွက်မဆို ပိတ်ထားပါ။

တိကျသော policy ရေးပါ

ဘယ်သူက row ဘယ်ဟာတွေကို select/insert/update/delete လုပ်ခွင့်ရှိလဲ တိတိကျကျ ဖော်ပြတဲ့ row-level security policy ထည့်ပါ။

နယ်နိမိတ်ကို စမ်းသပ်ပါ

ဝင်ရောက်ခွင့်မရှိသင့်တဲ့ data ကို တမင်တကာ ဝင်ကြည့်ကြည့်ပြီး policy က တကယ်ပိတ်ပေးလားစစ်ပါ။

Dashboard specific တွေ ပြောင်းလဲနေတဲ့အတွက် ရေရှည်တည်တံ့မယ့် practice ကတော့ ဖွင့်ထားပြီး ဘာမှမပေါ်ပါစေနဲ့လို့ မျှော်လင့်တာအစား ပိတ်ထားခြင်းဖြင့် စပြီး တမင်တကာ ဖွင့်ခြင်းပါပဲ။

Client-accessible key တွေက server secret မဟုတ်ပါ

Browser အသုံးပြုရန် ရည်ရွယ်ထားသော key (row-level security ကဲ့သို့ security policy များဖြင့် ကန့်သတ်ထားသည်) နှင့် server-only secret key (ထိုကန့်သတ်ချက်များကို ကျော်လွှားနိုင်သည်) တို့သည် အပြန်အလှန် အစားထိုးလို့မရပါ။ Server-only secret ကို browser-exposed code ထဲတွင် အသုံးပြုခြင်းသည် တကယ့် security risk ကြီးတစ်ခု ဖြစ်ပြီး visitor မှန်သမျှကို database အပြည့်အဝ ဝင်ရောက်ခွင့် ပေးလိုက်နိုင်ပါတယ်။

အတူတူ စမ်းရေးကြည့်မယ်

javascript
function checkKeyUsage(usage) {
  const { keyType, context } = usage;
  const risky = keyType === "service-role" && context === "browser";
  return risky ? "RISKY: service-role key exposed to browser" : "safe";
}

const scenarios = [
  { label: "anon key in frontend JS", keyType: "public-anon", context: "browser" },
  { label: "service-role key in frontend JS", keyType: "service-role", context: "browser" },
];

for (const s of scenarios) {
  console.log(`${s.label} -> ${checkKeyUsage(s)}`);
}
You should see
anon key in frontend JS -> safe
service-role key in frontend JS -> RISKY: service-role key exposed to browser
(anon key ကို row-level security က ကန့်သတ်ထားပြီး service-role key ကတော့ ကန့်သတ်ချက်အားလုံး ကျော်လွှားနိုင်တာကြောင့် risky ဖြစ်သည်။)

၅ မိနစ် စမ်းကြည့်

Private user note များ သိမ်းထားတဲ့ table တစ်ခုအတွက် user တစ်ဦးက သူ့ note ကိုသာ မြင်နိုင်ဖို့ row-level security policy က ဘာပြောရမလဲ ရိုးရှင်းစွာ ဖော်ပြပါ။

သတိလေးတစ်ချက်

Table တစ်ခုရဲ့ row-level security ကို configure မလုပ်ဘဲ (သို့) disable လုပ်ထားပြီး client-accessible key ကို ဖွင့်ထားခြင်း -- visitor မှန်သမျှ row အားလုံးကို ဖတ်/ပြောင်းနိုင်စေခြင်း။

Service-role (သို့) secret key ကို frontend code ထဲ ထည့်ထားခြင်း -- row-level security protection အားလုံးကို လုံးဝ ကျော်လွှားစေခြင်း။

PostgreSQL Documentation: Row Security PoliciesCloud Providers & Platforms

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • Table တစ်ခုရဲ့ row-level security ကို configure မလုပ်ဘဲ (သို့) disable လုပ်ထားပြီး client-accessible key ကို ဖွင့်ထားခြင်း -- visitor မှန်သမျှ row အားလုံးကို ဖတ်/ပြောင်းနိုင်စေခြင်း။
  • Service-role (သို့) secret key ကို frontend code ထဲ ထည့်ထားခြင်း -- row-level security protection အားလုံးကို လုံးဝ ကျော်လွှားစေခြင်း။
  • ဒီ course က provider/platform landscape ကို comparison-level မှာသာ သင်ပေးပါတယ် — AWS, Docker, CI/CD, Firebase, deployment fundamentals ကို နက်နက်ရှိုင်းရှိုင်း လေ့လာချင်ရင် AWS Fundamentals, Docker, CI/CD, Firebase, Cloud & Deployment tutorial တွေဆီ ဆက်သွားပါ။

လေ့ကျင့်ခန်း

Private user note များ သိမ်းထားတဲ့ table တစ်ခုအတွက် user တစ်ဦးက သူ့ note ကိုသာ မြင်နိုင်ဖို့ row-level security policy က ဘာပြောရမလဲ ရိုးရှင်းစွာ ဖော်ပြပါ။

You'll know it worked when: anon key in frontend JS -> safe service-role key in frontend JS -> RISKY: service-role key exposed to browser (anon key ကို row-level security က ကန့်သတ်ထားပြီး service-role key ကတော့ ကန့်သတ်ချက်အားလုံး ကျော်လွှားနိုင်တာကြောင့် risky ဖြစ်သည်။)