Projekt macierzy uprawnień dla narzędzi wewnętrznych: role i zakresy
Projekt macierzy uprawnień pomaga zmapować role, zakresy i wyjątki zanim zbudujesz ekrany i API, zmniejszając konieczność poprawek i błędy dostępu później.

Jakiego problemu rozwiązuje macierz uprawnień
Narzędzie wewnętrzne to oprogramowanie, którego zespół używa do codziennego prowadzenia działalności. Pomyśl o panelach administracyjnych, pulpitach operacyjnych, konsolach wsparcia, ekranach przeglądu finansów i małych aplikacjach, które pomagają zatwierdzać pracę, naprawiać dane lub odpowiadać klientom.
Te narzędzia mają dostęp do wrażliwych danych i umożliwiają potężne akcje. Agent wsparcia może potrzebować zobaczyć profil klienta, ale nigdy nie widzieć pełnych danych płatniczych. Pracownik finansów może eksportować faktury, ale nie powinien zmieniać ustawień konta. Lider operacji może robić obie rzeczy, ale tylko w swoim regionie.
Uprawnienia szybko się komplikują, bo narzędzia wewnętrzne rosną warstwami. Pojawiają się nowe role, stare role się dzielą, a jednorazowe wyjątki się kumulują: „Pozwól Marii na zwrot”, „Zablokuj dostęp kontraktorom do notatek”, „Pozwól liderom zatwierdzać tylko do 500$”. Gdy reguły żyją tylko w głowach ludzi (lub w rozrzuconych ticketach), ekrany i endpointy API zaczynają się rozjeżdżać, a w zabezpieczeniach pojawiają się luki.
Projekt macierzy uprawnień naprawia to, tworząc pojedynczą, współdzieloną mapę: kto może co robić, do jakich danych i w jakich ograniczeniach. Staje się ona źródłem prawdy zarówno dla decyzji UI (jakie ekrany, przyciski i pola pokazywać), jak i backendu (co serwer faktycznie pozwala, nawet gdy ktoś próbuje ominąć UI).
To nie jest tylko narzędzie dla programistów. Dobra macierz to dokument roboczy, z którym zgadzają się produkt, operacje i budowniczy. Jeśli budujesz na platformie no-code takiej jak AppMaster, macierz nadal jest niezbędna: wskazuje jak ustawić role, zdefiniować zasoby i utrzymać spójność między ekranami a wygenerowanymi endpointami.
Prosta macierz pomaga Ci:\n
- Uczynić reguły jawne zanim zaczniesz budować\n- Zmniejszyć chaos „specjalnych przypadków”\n- Utrzymać zgodność uprawnień UI i API\n- Przeglądać zmiany dostępu bez zgadywania\n
Kluczowe pojęcia: role, zasoby, akcje, zakresy, wyjątki
Dobry projekt macierzy uprawnień zaczyna się od wspólnego słownictwa. Jeśli zespół używa tych terminów w ten sam sposób, uniknie późniejszych komplikacji.
A rola to grupa osób o podobnych zadaniach i potrzebach dostępu. Pomyśl Support, Finanse, Operacje czy Menedżer. Role powinny opisywać, co ktoś robi na co dzień, nie jego seniority. Jedna osoba może mieć więcej niż jedną rolę, ale staraj się, by to było rzadkie.
Zasób to rzecz, którą chronisz. W narzędziach wewnętrznych typowe zasoby to klienci, zgłoszenia (tickets), faktury, raporty, integracje oraz ustawienia. Nazwij zasoby rzeczownikami — ułatwi to późniejsze przełożenie reguł na ekrany i endpointy API.
Akcja to to, co ktoś może zrobić z zasobem. Trzymaj czasowniki spójne, by macierz pozostała czytelna. Typowe akcje to:
- view (wyświetl)
- create (utwórz)
- edit (edytuj)
- delete (usuń)
- approve (zatwierdź)
- export (eksportuj)
Zakres odpowiada na pytanie „które rekordy?” bez tworzenia nowych ról. Zakresy często decydują o tym, czy dostęp jest bezpieczny, czy nie. Typowe zakresy to:
- own (własne — rekordy, które stworzyłeś lub do których jesteś przypisany)
- team (zespół)
- region (region/terytorium)
- all (wszystko)
Wyjątek to nadpisanie, które łamie zwykłe reguły roli i zakresu. Wyjątki mogą być tymczasowe (na zmianę), przypisane do konkretnego użytkownika (specjalista potrzebuje dodatkowej akcji) lub do jednego rekordu (VIP jest zablokowany). Traktuj wyjątki jako kontrolowane „zadłużenie”: zapisuj, kto je zatwierdził, dlaczego i kiedy wygasają.
Przykład: Agent wsparcia może „wyświetlać zgłoszenia” w zakresie „team”, ale dostaje krótkotrwały wyjątek na „eksport zgłoszeń” dla jednego przeglądu incydentu. W narzędziu zbudowanym w AppMaster takie reguły łatwiej utrzymać, jeśli od początku konsekwentnie nazwywane są role, zasoby, akcje i zakresy.
Decyzje do podjęcia zanim narysujesz macierz
Zacznij od uzgodnienia, co faktycznie chcesz chronić. Wypisz obszary narzędzia jako zasoby, nie jako ekrany. Ekran może pokazywać „Zamówienia”, „Zwroty” i „Klientów” w jednym miejscu, ale to różne zasoby o różnych ryzykach.
Zanim zapiszesz choć jedno uprawnienie, ustandaryzuj czasowniki-akcje. Małe różnice w nazewnictwie tworzą duplikaty reguł później (edit vs update, remove vs delete, view vs read). Wybierz krótki, wspólny zestaw i trzymaj się go we wszystkich zasobach. Dla większości narzędzi wewnętrznych wystarczy prosty zestaw: view, create, update, delete, approve, export.
Zakresy to następna decyzja i powinny pasować do tego, jak Twoja firma już myśli o strukturze. Zbyt wiele zakresów uczyni macierz nieczytelną; zbyt mało będzie rodzić wyjątki. Celuj w niewielki zestaw, który pasuje do organizacji, np.:
- own (rekordy, które stworzyłeś)
- team (rekordy twojego zespołu)
- location (oddział lub region)
- all (wszystko)
- none (brak dostępu)
Musisz też zadecydować o regule „braku dostępu”. Postaw na implicit deny (wszystko, co nie jest jawnie dozwolone, jest zabronione) — jest to bezpieczniejsze i prostsze. Explicit forbid przydaje się, gdy ktoś ma szeroki dostęp, ale chcesz zablokować konkretną akcję, np. „Finanse mają dostęp do wszystkich faktur, ale nie mogą usuwać”.
Oznacz działania wrażliwe na zgodność wcześnie, zanim zginą w siatce. Eksporty, usunięcia, wypłaty, zmiany ról i dostęp do danych osobowych zasługują na dodatkową uwagę, logowanie i często krok zatwierdzający. Na przykład możesz pozwolić liderowi wsparcia na aktualizację profilu klienta, ale wymagać zatwierdzenia finansów przed stworzeniem lub eksportem wypłaty.
Jeśli budujesz w AppMaster, te decyzje czysto mapują się później na endpointy backendu i logikę Business Process, ale macierz musi być najpierw jasna.
Krok po kroku: budowanie macierzy uprawnień od zera
Zacznij od pracy, którą ludzie wykonują, a nie od ekranów, które planujesz zbudować. Jeśli zaczniesz od ekranów, skopiujesz dzisiejsze UI i przegapisz prawdziwe reguły (kto może zatwierdzić zwroty, kto może edytować rekord klienta po jego zamknięciu itp.).
Prosty sposób pracy to traktować projekt macierzy jak mapę zadań do dostępu, a potem przekształcić ją w aplikację.
Praktyczna kolejność działań
-
Wypisz zadania biznesowe prostym językiem. Przykłady: „Wystaw zwrot”, „Zmień email klienta”, „Eksportuj faktury za ostatni miesiąc”. Trzymaj je krótkie i realne.
-
Przekształć zadania w zasoby i akcje. Zasoby to rzeczowniki (Invoice, Ticket, Customer), akcje to czasowniki (view, create, edit, approve, export). Wyznacz właściciela dla każdego zasobu: jedną osobę, która wyjaśni przypadki brzegowe i potwierdzi regułę.
-
Zdefiniuj role oparte na stabilnych zespołach. Użyj grup jak Support, Finance, Operations, Team Lead. Unikaj tytułów, które często się zmieniają (Senior, Junior), chyba że rzeczywiście zmieniają dostęp.
-
Wypełnij macierz minimalnym dostępem, którego każda rola potrzebuje do wykonania zadań. Jeśli Support potrzebuje tylko wyświetlać faktury do odpowiadania na pytania, nie dawaj mu „eksport” domyślnie. Zawsze możesz dodać dostęp później, ale odebranie go później łamie nawyki.
-
Dodaj zakresy tylko tam, gdzie mają znaczenie. Zamiast osobnego uprawnienia „edit”, zanotuj zakresy jak „edit own”, „edit assigned” czy „edit all”. To utrzymuje reguły czytelne bez tworzenia 50 ról.
Zapisuj wyjątki w osobnej tabeli, a nie jako chaotyczne notatki w macierzy. Każdy wyjątek potrzebuje pola z powodem (zgodność, ryzyko oszustwa, separacja obowiązków) i jednego właściciela, który go zatwierdzi.
Gdy to zrobisz, narzędzia takie jak AppMaster ułatwiają przekształcenie macierzy w chronione endpointy i ekrany administracyjne bez zgadywania reguł podczas budowy.
Jak zorganizować macierz, żeby była użyteczna
Macierz uprawnień jest pomocna tylko wtedy, gdy da się ją szybko przeczytać. Jeśli zamienia się w ogromną ścianę komórek, zespoły przestają z niej korzystać, a uprawnienia odpływają od intencji.
Zacznij od podziału macierzy na domeny. Zamiast jednej kartki na wszystko, użyj jednej zakładki na obszar biznesu: Klienci, Rozliczenia, Treści itd. Większość ról dotyka tylko kilku domen, więc to przyspiesza przeglądy i zmniejsza ryzyko przypadkowych zmian.
Stosuj wzorzec nazewnictwa, który jest spójny między zakładkami. Prosty format Resource.Action.Scope sprawia, że od razu widać, co oznacza dane uprawnienie i zapobiega duplikatom. Na przykład Invoice.Approve.Department czyta się tak samo jak Customer.Edit.Own.
Gdy natrafisz na przypadek brzegowy, powstrzymaj się od tworzenia nowej roli. Dodaj krótką notatkę obok komórki opisującą wyjątek i kiedy ma zastosowanie. Przykład: Support może wyświetlać faktury, ale tylko po weryfikacji tożsamości klienta. Notatka może też wskazywać dodatkowy krok UI, bez zmiany modelu ról.
Oznacz uprawnienia wysokiego ryzyka, by wyróżniały się podczas przeglądu. To akcje typu zwroty, zatwierdzenia, eksporty i usuwanie danych. Oznacz komórki i zapisz dodatkową kontrolę, jak zatwierdzenie dwóch osób czy potwierdzenie menedżera.
Aby macierz pozostała utrzymywalna w czasie, wersjonuj ją jak prawdziwy artefakt:
- v1, v2 itd. + data\n- właściciel (osoba odpowiedzialna)\n- krótka notka o zmianie\n- co spowodowało zmianę (nowy workflow, uwaga audytu)
Gdy macierz jest stabilna, łatwiej zbudować ekrany i endpointy w AppMaster, bo każdy przycisk i akcja API mapują się do klarownej nazwy uprawnienia.
Przekładanie macierzy na ekrany i endpointy
Macierz uprawnień jest użyteczna tylko wtedy, gdy stanie się realnymi regułami w dwóch miejscach: API i UI. Traktuj każdy zasób w macierzy (Tickets, Invoices, Users) jak grupę endpointów. Trzymaj akcje zgodne z czasownikami macierzy: view, create, edit, approve, export, delete.
Po stronie API egzekwuj uprawnienia przy każdym żądaniu. Kontrole w UI są pomocne do przejrzystości, ale nie zastępują zabezpieczeń. Ukryty przycisk nie powstrzyma bezpośredniego wywołania API.
Prosty sposób na przetłumaczenie macierzy na uprawnienia API to nazwać uprawnienia spójnie i przypiąć je tam, gdzie następuje akcja:
- tickets:view, tickets:edit, tickets:export\n- invoices:view, invoices:approve, invoices:delete\n- users:view, users:invite
Następnie użyj tych samych nazw, by sterować widocznością w UI: elementy menu, dostęp do stron, przyciski, a nawet pola. Na przykład agent wsparcia może widzieć listę zgłoszeń i otwierać zgłoszenie, ale pole „Zwrot” będzie tylko do odczytu, jeśli nie ma invoices:approve.
Uważaj na różnicę między dostępem do listy a dostępem do szczegółów. Często zespoły potrzebują „widzieć, że coś istnieje”, bez dostępu do pełnego rekordu. To oznacza, że można dopuścić wyniki listy z ograniczonymi kolumnami, ale zablokować otwarcie widoku szczegółowego bez uprawnienia szczegółowego (lub spełnienia warunku zakresu, np. „przypisane do mnie”). Zdecyduj o tym wcześnie, żeby nie zbudować listy, która wycieka wrażliwe dane.
Na koniec, mapuj logowanie audytowe do akcji, które mają znaczenie. Eksporty, usunięcia, zatwierdzenia, zmiany ról i pobrania danych powinny tworzyć zdarzenia audytowe z informacją kto, co, kiedy i który rekord. Jeśli budujesz w AppMaster, odzwierciedlisz to w logice endpointów i przepływach biznesowych, tak by ta sama reguła wywoływała akcję i wpis audytowy.
Typowe błędy i pułapki
Najszybszy sposób, by zepsuć projekt macierzy, to modelować UI zamiast biznesu. Ekran może pokazywać kilka rzeczy, a ta sama rzecz może pojawiać się na wielu ekranach. Jeśli traktujesz każdy ekran jak oddzielny zasób, powielasz reguły, przegapisz przypadki brzegowe i będziesz się spierać o nazewnictwo zamiast o dostęp.
Inną pułapką jest mnożenie ról. Zespoły ciągle dodają role (Support Level 1, Support Level 2, Support Manager itd.), podczas gdy mniejszy zestaw ról plus jasne zakresy wystarczyłby. Zakresy jak „własny zespół”, „przypisany region” czy „konta, którymi zarządzasz” zwykle tłumaczą różnicę lepiej niż nowa rola.
Kilka błędów, które często pojawiają się w realnych narzędziach:
- Definiowanie tylko „view” i „edit”, a zapominanie o akcjach typu eksport, masowa edycja, zwrot, podszywanie się (impersonate) czy „zmiana właściciela”.
- Używanie wyjątków jako długoterminowej łaty. Jednorazowe nadania („daj Samowi dostęp do Finansów na tydzień”) szybko stają się permanentne i maskują złe modelowanie ról.
- Ukrywanie przycisków w UI i zakładanie, że to wystarczy do zabezpieczenia. API nadal musi odrzucać żądanie, nawet jeśli użytkownik znajdzie endpoint.
- Brak decyzji, co się dzieje, gdy czyjś zakres się zmienia (transfer zespołu, zmiana regionu). Uprawnienia powinny aktualizować się przewidywalnie, a nie dryfować.
- Traktowanie „admina” jako wszechmocnego bez ograniczeń. Nawet admini często potrzebują separacji obowiązków, np. „może zarządzać użytkownikami”, ale „nie może zatwierdzać wypłat”.
Wyjątki wymagają szczególnej ostrożności. Są przydatne tymczasowo, ale powinny wygasać lub być przeglądane. Jeśli wyjątków przybywa, to znak, że role albo zakresy nie są dobrze zmapowane.
Szybki przykład: w narzędziu wsparcia i finansów Support może przeglądać profile klientów i tworzyć zgłoszenia, ale Finanse mogą eksportować faktury i wystawiać zwroty. Jeśli zabezpieczysz tylko strony, agent wsparcia nadal może wywołać endpoint eksportu bezpośrednio. Niezależnie od tego, czy budujesz w kodzie, czy w platformie generującej backend jak AppMaster, reguła powinna istnieć po stronie serwera, nie tylko w UI.
Szybka lista kontrolna przed rozpoczęciem budowy
Macierz uprawnień jest użyteczna tylko wtedy, gdy staje się jasnymi, egzekwowalnymi regułami. Zanim stworzysz pierwszy ekran lub endpoint, przejdź przez tę listę kontrolną. Pomoże uniknąć „prawie bezpiecznych” konfiguracji, które pękają przy nowej roli lub przypadku brzegowym.
Zbuduj reguły, potem UI
Zacznij od domyślnej polityki deny: wszystko, co nie jest wyraźnie dozwolone, jest zablokowane. To najbezpieczniejsza baza i zapobiega niespodziewanemu dostępowi przy dodawaniu nowych funkcji.
Upewnij się, że masz jedno źródło prawdy dla uprawnień. Niezależnie czy to dokument, tabela w bazie czy konfiguracja no-code, każdy w zespole powinien wiedzieć, gdzie są aktualne reguły. Jeśli arkusz mówi jedno, a aplikacja robi drugie, będą błędy.
Oto skondensowana lista pre-build do użycia przy projektowaniu macierzy:
- Domyślna odmowa jest egzekwowana wszędzie (przyciski UI, endpointy API, eksporty, zadania w tle).\n- Każda akcja ma jasną definicję zakresu (własne rekordy, zespół, region, wszystko lub podzbiór nazwany).\n- Uprawnienia administracyjne są oddzielone od akcji biznesowych (zarządzanie rolami ≠ zatwierdzanie zwrotu).\n- Działania wrażliwe wymagają silniejszych zabezpieczeń (kroki zatwierdzające, logowanie, alerty).\n- Wyjątki mają właściciela i datę wygaśnięcia, żeby „tymczasowy dostęp” nie stał się stały.
Potem sprawdź reguły jednym realistycznym scenariuszem. Na przykład: „Agent wsparcia może wyświetlić zamówienie i dodać notatkę dla swojego regionu, ale nie może zmieniać cen ani wydawać zwrotów. Finanse mogą wydawać zwroty, ale tylko po zatwierdzeniu menedżera, a każdy zwrot jest logowany.” Jeśli nie potrafisz tego streścić w jednym lub dwóch zdaniach, zakresy i wyjątki nie są jeszcze jasne.
Jeśli budujesz w AppMaster, traktuj te elementy jako wymagania zarówno dla ekranów, jak i logiki biznesowej. Przyciski mogą ukrywać akcje, ale to reguły backendowe naprawdę je egzekwują.
Przykładowy scenariusz: narzędzie wewnętrzne dla wsparcia i finansów
Wyobraź sobie średniej wielkości firmę z jednym narzędziem używanym przez Support i Finance. Ta sama baza trzyma Customers, Tickets, Refunds, Payouts i mały obszar Settings (szablony, integracje). To aplikacja, gdzie zwykłe logowanie nie wystarczy.
Oto role, które zdecydują się wdrożyć na start:
- Agent wsparcia: pracuje nad zgłoszeniami w jednym queue\n- Lider wsparcia: pomaga między kolejkami i zatwierdza pewne akcje\n- Finanse: zajmuje się sprawami pieniężnymi\n- Administrator operacji: odpowiada za kontrolę dostępu i ustawienia systemu
Praktyczny projekt zaczyna się od wypisania akcji na zasób, a potem doprecyzowania ich zakresem.
Dla Tickets: Agenci wsparcia mogą wyświetlać i aktualizować status zgłoszeń tylko w przypisanej kolejce. Mogą dodawać notatki, ale nie zmieniać właściciela zgłoszenia. Liderzy wsparcia mogą robić wszystko, co Agent, plus przekazywać zgłoszenia w ramach swojego regionu.
Dla Refunds: Finanse mogą tworzyć i zatwierdzać zwroty, ale tylko do określonej kwoty. Support może tworzyć wniosek o zwrot, ale nie może go zatwierdzić. Zatwierdzenie zwrotu jest oddzielną akcją od jego stworzenia, więc pozostaje widoczne w macierzy i nie zostanie nadane przypadkowo.
Dla Payouts i Settings zasady są restrykcyjne: tylko Finanse widzą payouts, a tylko Administrator operacji może zmieniać Settings. Support nie widzi tych ekranów, co zmniejsza pokusę i liczbę pomyłek.
Dodaj teraz regułę wyjątkową: Lider wsparcia tymczasowo pokrywa inny region przez dwa tygodnie. Zamiast dawać mu szeroką rolę Admina, macierz może zawierać tymczasowe rozszerzenie zakresu (Lider wsparcia + Region B, wygasa w określonym dniu). Taki pojedynczy wyjątek jest bezpieczniejszy niż kopiowanie uprawnień między rolami.
Jeśli budujesz w AppMaster, ta sama macierz wskaże, jakie strony pojawiają się w UI i co endpointy pozwalają robić na backendzie, dzięki czemu nikt nie trafi do Payouts czy Settings zgadując wywołanie API.
Jak testować i utrzymywać uprawnienia w czasie
Uprawnienia zwykle zawodzą w drobnych, nudnych sytuacjach: jeden ekran zapomni ukryć przycisk, jeden endpoint pominie sprawdzenie, jedna reguła zakresu będzie zbyt szeroka. Projekt macierzy staje się dużo bardziej wartościowy, gdy zamienisz go na powtarzalne testy i prosty proces utrzymania.
Zacznij od małego zestawu kont testowych. Nie potrzebujesz dziesiątek kont — jedno konto na rolę plus jedno „edge” konto na typowy wyjątek (np. „Agent z uprawnieniem do zatwierdzania zwrotów”) wystarczy. Trzymaj je stabilnie, by zespół mógł ich używać w kolejnych sprintach.
Następnie zamień reguły macierzy na przypadki testowe. Dla każdej reguły napisz jedną ścieżkę "dozwoloną" i jedną "zabronioną". Ścieżka zabroniona powinna być konkretna (co ma się stać), żeby nie dało się jej zignorować.
- Rola: Agent wsparcia. Akcja: Zwrot. Oczekiwanie: odrzucone z jasnym komunikatem, bez zmiany danych.\n- Rola: Finanse. Akcja: Zwrot. Oczekiwanie: dozwolone, tworzy rekord zwrotu, loguje aktora i powód.\n- Rola: Menedżer. Akcja: Wyświetl zgłoszenia. Zakres: tylko zespół. Oczekiwanie: może zobaczyć zgłoszenia zespołu, nie może otwierać zgłoszeń innych zespołów.
Testuj tę samą regułę dwukrotnie: w UI i w API. Jeśli UI blokuje akcję, a API nadal ją pozwala, ktoś może obejść ekran. Jeśli budujesz w AppMaster, sprawdź, że logika UI i endpointy backendowe narzucają te same reguły.
Zakresy wymagają rzeczywistych danych do testów. Stwórz testowe rekordy różniące się właścicielstwem, zespołem i regionem. Sprawdź, że nie możesz „zgadnąć” identyfikatora z innego zakresu i uzyskać dostępu.
Na koniec zdecyduj, co logować dla wrażliwych akcji (zwroty, eksporty, zmiany ról). Loguj kto, co, kiedy i skąd. Przeglądaj logi w ustalonym rytmie i dodaj reguły alertów dla rzadkich działań, jak edycje uprawnień czy masowe eksporty.
Następne kroki: z macierzy do działającego narzędzia wewnętrznego
Traktuj macierz uprawnień jak plan budowy, nie dokument do odłożenia. Najszybsza droga do wartości to potwierdzenie podstaw z właścicielami danych i procesów.
Zacznij od krótkiego warsztatu (30 minut wystarczy) z jednym reprezentantem każdej roli plus właścicielami zasobów (osoby odpowiedzialne za klientów, faktury, wypłaty, zgłoszenia itd.). Przejdź przez role, zasoby, akcje i zakresy i wypisz „specjalne przypadki”. Jeśli wyjątek wydaje się częsty, prawdopodobnie brakuje zakresu.
Następnie przygotuj wersję v1 macierzy i zrób skoncentrowany przegląd z właścicielami zasobów. Trzymaj to praktycznie: „Czy Support może wyświetlać faktury?” „Czy Finanse mogą edytować dane klienta?” Jeśli ktoś się waha, najpierw zapisz regułę prostym językiem, formalizuj później.
Gdy v1 zostanie zaakceptowana, zbuduj jedną domenę end-to-end zanim rozszerzysz. Wybierz cienki wycinek, który dotyka danych, logiki i UI (np. Ticketing lub zatwierdzenia faktur). Musisz umieć odpowiedzieć: kto może to zobaczyć, kto może to zmienić i co się dzieje, gdy spróbuje.
Jeśli używasz AppMaster, przed generowaniem powiąż macierz z elementami produktu:
- Data Designer: dopasuj zasoby do encji (tabel) i kluczowych pól wpływających na zakres (np. team_id, region_id)\n- Business Processes: egzekwuj reguły tam, gdzie zachodzą zmiany (create, update, approve, export)\n- Widoczność UI: ukrywaj akcje, których użytkownik nie może wykonać, i pokazuj jasne komunikaty „dlaczego” przy odmowie dostępu\n- Endpointy: wystawiaj tylko to, czego każda rola potrzebuje, i trzymaj operacje admin-only oddzielnie
Prosty przykład: zbuduj przepływ „Wniosek o zwrot” z dwiema rolami (Support tworzy, Finanse zatwierdzają). Gdy to działa, dopisz przypadki brzegowe jak „Support może anulować tylko w ciągu 30 minut”.
Wypróbuj małe narzędzie wewnętrzne w AppMaster, by wcześnie zwalidować role i przepływy, potem iteruj na podstawie macierzy. Celem jest wykryć nieporozumienia, zanim będziesz miał 20 ekranów i stos poprawek uprawnień.


