{"id":1367,"date":"2026-04-14T13:15:08","date_gmt":"2026-04-14T11:15:08","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1367"},"modified":"2026-04-20T13:18:17","modified_gmt":"2026-04-20T11:18:17","slug":"parametry-uzytkownika","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/04\/14\/parametry-uzytkownika\/","title":{"rendered":"Parametry u\u017cytkownika"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">System informatyczny rzadko dzia\u0142a w oderwaniu od cz\u0142owieka. Nawet najprostsza aplikacja musi wiedzie\u0107, kto korzysta z us\u0142ugi, jakie ma uprawnienia, jakie preferencje zapisu danych, w jakim j\u0119zyku pracuje i jakie operacje s\u0105 dla niego dozwolone. Bez tego nie da si\u0119 poprawnie zbudowa\u0107 logowania, personalizacji ani bezpiecze\u0144stwa. W praktyce ca\u0142a ta warstwa sprowadza si\u0119 do dobrze zaprojektowanych danych opisuj\u0105cych <strong>Parametry u\u017cytkownika<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis Tre\u015bci<\/h2><nav><ol><li><a href=\"#parametry-uzytkownika-a-walidacja-danych-wejsciowych-spojnosc-rekordow-i-unikanie-kosztownych-bledow\">Parametry u\u017cytkownika a walidacja danych wej\u015bciowych, sp\u00f3jno\u015b\u0107 rekord\u00f3w i unikanie kosztownych b\u0142\u0119d\u00f3w<\/a><ol><li><a href=\"#przyklad-walidacji-w-python\">Przyk\u0142ad walidacji w Python<\/a><\/li><li><a href=\"#przyklad-walidacji-w-c\">Przyk\u0142ad walidacji w C<\/a><\/li><li><a href=\"#przyklad-walidacji-w-c-1\">Przyk\u0142ad walidacji w C++<\/a><\/li><\/ol><\/li><li><a href=\"#zarzadzanie-uprawnieniami-i-kontrola-dostepu-bez-niebezpiecznych-uproszczen\">Zarz\u0105dzanie uprawnieniami i kontrola dost\u0119pu bez niebezpiecznych uproszcze\u0144<\/a><\/li><li><a href=\"#parametry-uzytkownika-w-kontekscie-bezpieczenstwa-hasel-sesji-i-historii-operacji\">Parametry u\u017cytkownika w kontek\u015bcie bezpiecze\u0144stwa hase\u0142, sesji i historii operacji<\/a><\/li><li><a href=\"#pulapki-projektowe-ktore-pozniej-kosztuja-najwiecej-czasu-i-pieniedzy\">Pu\u0142apki projektowe, kt\u00f3re p\u00f3\u017aniej kosztuj\u0105 najwi\u0119cej czasu i pieni\u0119dzy<\/a><ol><li><a href=\"#jeden-login-jako-klucz-glowny\">Jeden login jako klucz g\u0142\u00f3wny<\/a><\/li><li><a href=\"#brak-wersjonowania-zmian\">Brak wersjonowania zmian<\/a><\/li><li><a href=\"#nadmiar-danych-osobowych\">Nadmiar danych osobowych<\/a><\/li><li><a href=\"#brak-polityki-wygasania-sesji\">Brak polityki wygasania sesji<\/a><\/li><li><a href=\"#uprawnienia-zapisane-na-sztywno-w-kodzie\">Uprawnienia zapisane na sztywno w kodzie<\/a><\/li><\/ol><\/li><li><a href=\"#faq\">FAQ<\/a><ol><li><a href=\"#czy-identyfikator-uzytkownika-powinien-byc-adresem-e-mail\">Czy identyfikator u\u017cytkownika powinien by\u0107 adresem e-mail?<\/a><\/li><li><a href=\"#czy-walidacja-w-java-script-wystarcza\">Czy walidacja w JavaScript wystarcza?<\/a><\/li><li><a href=\"#czy-jedna-rola-dla-jednego-uzytkownika-to-dobre-rozwiazanie\">Czy jedna rola dla jednego u\u017cytkownika to dobre rozwi\u0105zanie?<\/a><\/li><li><a href=\"#dlaczego-przechowywanie-historii-logowania-jest-wazne\">Dlaczego przechowywanie historii logowania jest wa\u017cne?<\/a><\/li><li><a href=\"#czy-wszystkie-ustawienia-powinny-byc-w-jednej-tabeli\">Czy wszystkie ustawienia powinny by\u0107 w jednej tabeli?<\/a><\/li><\/ol><\/li><\/ol><\/nav><\/div>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Pole<\/th><th>Typ danych<\/th><th>Przyk\u0142ad<\/th><th>Znaczenie<\/th><\/tr><\/thead><tbody><tr><td>id<\/td><td>BIGINT \/ UUID<\/td><td>10452<\/td><td>trwa\u0142y identyfikator<\/td><\/tr><tr><td>email<\/td><td>VARCHAR<\/td><td><a>user@firma.pl<\/a><\/td><td>kontakt i logowanie<\/td><\/tr><tr><td>password_hash<\/td><td>VARCHAR<\/td><td>hash bcrypt<\/td><td>bezpiecze\u0144stwo<\/td><\/tr><tr><td>status<\/td><td>ENUM<\/td><td>active<\/td><td>stan konta<\/td><\/tr><tr><td>created_at<\/td><td>TIMESTAMP<\/td><td>2026-04-20<\/td><td>data utworzenia<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Tabela <code>roles<\/code> nie powinna przechowywa\u0107 logiki biznesowej w kodzie na sztywno. Lepiej przypisa\u0107 rol\u0119 w bazie.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>id<\/th><th>nazwa roli<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>admin<\/td><\/tr><tr><td>2<\/td><td>manager<\/td><\/tr><tr><td>3<\/td><td>operator<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Relacja wiele-do-wielu mi\u0119dzy u\u017cytkownikiem a uprawnieniami jest standardem w wi\u0119kszych systemach.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142adowy wz\u00f3r oceny poziomu ryzyka konta mo\u017ce wygl\u0105da\u0107 tak:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Zastosowanie<\/th><th>Wz\u00f3r<\/th><\/tr><\/thead><tbody><tr><td>ocena ryzyka logowania<\/td><td>R = aL + bF + cI<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Gdzie:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>L<\/code> \u2014 liczba nieudanych logowa\u0144<\/li>\n\n\n\n<li><code>F<\/code> \u2014 cz\u0119stotliwo\u015b\u0107 zmian urz\u0105dze\u0144<\/li>\n\n\n\n<li><code>I<\/code> \u2014 nietypowo\u015b\u0107 adresu IP<\/li>\n\n\n\n<li><code>a, b, c<\/code> \u2014 wagi ustalone przez system<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Taki model stosuje si\u0119 np. przy wymuszaniu dodatkowego uwierzytelnienia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"parametry-uzytkownika-a-walidacja-danych-wejsciowych-spojnosc-rekordow-i-unikanie-kosztownych-bledow\">Parametry u\u017cytkownika a walidacja danych wej\u015bciowych, sp\u00f3jno\u015b\u0107 rekord\u00f3w i unikanie kosztownych b\u0142\u0119d\u00f3w<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najwi\u0119cej problem\u00f3w nie wynika z braku danych, ale z ich z\u0142ej jako\u015bci.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Typowe b\u0142\u0119dy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>brak walidacji adresu e-mail<\/li>\n\n\n\n<li>mo\u017cliwo\u015b\u0107 ustawienia pustego has\u0142a<\/li>\n\n\n\n<li>zapis ujemnego limitu transakcji<\/li>\n\n\n\n<li>niesp\u00f3jna strefa czasowa<\/li>\n\n\n\n<li>przechowywanie dat jako tekst<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Walidacja musi wyst\u0119powa\u0107 na dw\u00f3ch poziomach:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>po stronie aplikacji<\/li>\n\n\n\n<li>po stronie bazy danych<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Sama walidacja frontendowa nie wystarcza. U\u017cytkownik mo\u017ce omin\u0105\u0107 formularz i wys\u0142a\u0107 \u017c\u0105danie bezpo\u015brednio do API.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-walidacji-w-python\">Przyk\u0142ad walidacji w Python<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>python\\nemail = input()\\n\\nif \\\"@\\\" not in email or len(email) &lt; 5:\\n print(\\\"B\u0142\u0119dny adres\\\")\\nelse:\\n print(\\\"OK\\\")\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-walidacji-w-c\">Przyk\u0142ad walidacji w C<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>C<\/td><td><code>c\\n#include &lt;stdio.h&gt;\\n#include &lt;string.h&gt;\\n\\nint main() {\\n char email[100];\\n scanf(\\\"%99s\\\", email);\\n\\n if (strchr(email, '@') == NULL) {\\n printf(\\\"Bledny adres\\\\n\\\");\\n } else {\\n printf(\\\"OK\\\\n\\\");\\n }\\n return 0;\\n}\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-walidacji-w-c-1\">Przyk\u0142ad walidacji w C++<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>C++<\/td><td><code>cpp\\n#include &lt;iostream&gt;\\n#include &lt;string&gt;\\n\\nint main() {\\n std::string email;\\n std::cin &gt;&gt; email;\\n\\n if (email.find('@') == std::string::npos) {\\n std::cout &lt;&lt; \\\"Bledny adres\\\\n\\\";\\n } else {\\n std::cout &lt;&lt; \\\"OK\\\\n\\\";\\n }\\n}\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">W systemach produkcyjnych walidacja jest znacznie bardziej rozbudowana: regex, regu\u0142y biznesowe, ograniczenia transakcyjne i kontrola integralno\u015bci relacyjnej.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"zarzadzanie-uprawnieniami-i-kontrola-dostepu-bez-niebezpiecznych-uproszczen\">Zarz\u0105dzanie uprawnieniami i kontrola dost\u0119pu bez niebezpiecznych uproszcze\u0144<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bardzo cz\u0119sty b\u0142\u0105d to logika typu:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">if user == admin<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To dzia\u0142a tylko chwilowo. Gdy pojawia si\u0119 wi\u0119cej r\u00f3l, system zaczyna si\u0119 rozpada\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lepszy model to RBAC &#8211; Role-Based Access Control.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Schemat dzia\u0142ania:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>u\u017cytkownik ma przypisan\u0105 rol\u0119<\/li>\n\n\n\n<li>rola ma przypisane uprawnienia<\/li>\n\n\n\n<li>aplikacja sprawdza uprawnienie, nie nazw\u0119 roli<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Operacja<\/th><th>Wymagane uprawnienie<\/th><\/tr><\/thead><tbody><tr><td>usuni\u0119cie faktury<\/td><td>invoice.delete<\/td><\/tr><tr><td>podgl\u0105d raportu<\/td><td>report.read<\/td><\/tr><tr><td>eksport danych<\/td><td>export.execute<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dzi\u0119ki temu mo\u017cna doda\u0107 now\u0105 rol\u0119 bez zmian w kodzie aplikacji.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W systemach finansowych lub medycznych stosuje si\u0119 dodatkowo zasad\u0119 najmniejszych uprawnie\u0144. U\u017cytkownik dostaje tylko to, co jest absolutnie konieczne.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To ogranicza realne straty przy b\u0142\u0119dzie lub przej\u0119ciu konta.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"parametry-uzytkownika-w-kontekscie-bezpieczenstwa-hasel-sesji-i-historii-operacji\">Parametry u\u017cytkownika w kontek\u015bcie bezpiecze\u0144stwa hase\u0142, sesji i historii operacji<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Has\u0142o nigdy nie powinno by\u0107 przechowywane w postaci jawnej.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poprawny proces:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>u\u017cytkownik podaje has\u0142o<\/li>\n\n\n\n<li>system generuje hash<\/li>\n\n\n\n<li>w bazie zapisywany jest tylko hash<\/li>\n\n\n\n<li>podczas logowania por\u00f3wnywany jest wynik funkcji skr\u00f3tu<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119\u015bciej stosowane algoryt:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>bcrypt<\/li>\n\n\n\n<li>Argon2<\/li>\n\n\n\n<li>scrypt<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">SHA-256 bez dodatkowych mechanizm\u00f3w nie jest dzi\u015b wystarczaj\u0105cym zabezpieczeniem dla hase\u0142 u\u017cytkownik\u00f3w.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad w Python:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>python\\nimport hashlib\\n\\nhaslo = \\\"Test123\\\"\\nhash_hasla = hashlib.sha256(haslo.encode()).hexdigest()\\nprint(hash_hasla)\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To jest przyk\u0142ad edukacyjny, ale w praktyce nale\u017cy u\u017cywa\u0107 bcrypt lub Argon2.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Warto te\u017c przechowywa\u0107:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>dat\u0119 ostatniej zmiany has\u0142a<\/li>\n\n\n\n<li>liczb\u0119 b\u0142\u0119dnych logowa\u0144<\/li>\n\n\n\n<li>aktywne sesje<\/li>\n\n\n\n<li>identyfikator urz\u0105dzenia<\/li>\n\n\n\n<li>histori\u0119 krytycznych operacji<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Brak tych danych cz\u0119sto oznacza brak mo\u017cliwo\u015bci analizy incydentu po ataku.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"pulapki-projektowe-ktore-pozniej-kosztuja-najwiecej-czasu-i-pieniedzy\">Pu\u0142apki projektowe, kt\u00f3re p\u00f3\u017aniej kosztuj\u0105 najwi\u0119cej czasu i pieni\u0119dzy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najdro\u017csze b\u0142\u0119dy zwykle nie s\u0105 spektakularne. To drobne decyzje z pocz\u0105tku projektu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ady:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"jeden-login-jako-klucz-glowny\">Jeden login jako klucz g\u0142\u00f3wny<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Po zmianie adresu e-mail zaczyna si\u0119 problem z relacjami i histori\u0105 danych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"brak-wersjonowania-zmian\">Brak wersjonowania zmian<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie wiadomo, kto zmieni\u0142 limit kredytowy albo usun\u0105\u0142 dost\u0119p operatorowi.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"nadmiar-danych-osobowych\">Nadmiar danych osobowych<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">System zbiera informacje, kt\u00f3rych nie potrzebuje. To zwi\u0119ksza ryzyko prawne i koszt ochrony danych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"brak-polityki-wygasania-sesji\">Brak polityki wygasania sesji<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">U\u017cytkownik zostawia zalogowane stanowisko i kto\u015b przejmuje dost\u0119p.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"uprawnienia-zapisane-na-sztywno-w-kodzie\">Uprawnienia zapisane na sztywno w kodzie<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ka\u017cda zmiana wymaga wdro\u017cenia produkcyjnego.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Takie decyzje wygl\u0105daj\u0105 niewinnie na pocz\u0105tku, ale po roku utrzymania staj\u0105 si\u0119 realnym kosztem operacyjnym.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-identyfikator-uzytkownika-powinien-byc-adresem-e-mail\">Czy identyfikator u\u017cytkownika powinien by\u0107 adresem e-mail?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie. Adres e-mail mo\u017ce si\u0119 zmieni\u0107. Identyfikator powinien by\u0107 trwa\u0142y i niezale\u017cny od danych biznesowych, najlepiej jako liczba lub UUID.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-walidacja-w-java-script-wystarcza\">Czy walidacja w JavaScript wystarcza?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie. Frontend poprawia wygod\u0119 u\u017cytkownika, ale bezpiecze\u0144stwo musi by\u0107 wymuszane tak\u017ce po stronie backendu i bazy danych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-jedna-rola-dla-jednego-uzytkownika-to-dobre-rozwiazanie\">Czy jedna rola dla jednego u\u017cytkownika to dobre rozwi\u0105zanie?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tylko w bardzo prostych systemach. W praktyce lepiej przygotowa\u0107 model umo\u017cliwiaj\u0105cy wiele r\u00f3l lub bezpo\u015brednie mapowanie uprawnie\u0144.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-przechowywanie-historii-logowania-jest-wazne\">Dlaczego przechowywanie historii logowania jest wa\u017cne?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Pozwala wykrywa\u0107 przej\u0119cia kont, nietypowe logowania i analizowa\u0107 incydenty bezpiecze\u0144stwa po fakcie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-wszystkie-ustawienia-powinny-byc-w-jednej-tabeli\">Czy wszystkie ustawienia powinny by\u0107 w jednej tabeli?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie. Dane identyfikacyjne, bezpiecze\u0144stwo, konfiguracja i historia dzia\u0142a\u0144 maj\u0105 r\u00f3\u017cne cele i powinny by\u0107 logicznie rozdzielone.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dobrze zaprojektowany model danych u\u017cytkownika nie jest dodatkiem do systemu, tylko jego fundamentem. Je\u017celi ta warstwa jest zrobiona \u017ale, problemy pojawiaj\u0105 si\u0119 wsz\u0119dzie: w bezpiecze\u0144stwie, raportowaniu, utrzymaniu i rozwoju aplikacji. Je\u017celi jest zrobiona poprawnie, wi\u0119kszo\u015b\u0107 dalszych decyzji staje si\u0119 po prostu prostsza.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u0179r\u00f3d\u0142o Foto: Freepik<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>System informatyczny rzadko dzia\u0142a w oderwaniu od cz\u0142owieka. Nawet najprostsza aplikacja musi wiedzie\u0107, kto korzysta z us\u0142ugi, jakie ma uprawnienia, jakie preferencje zapisu danych, w jakim j\u0119zyku pracuje i jakie operacje s\u0105 dla niego dozwolone. Bez tego nie da si\u0119 poprawnie zbudowa\u0107 logowania, personalizacji ani bezpiecze\u0144stwa. W praktyce ca\u0142a ta warstwa sprowadza si\u0119 do dobrze zaprojektowanych danych opisuj\u0105cych Parametry u\u017cytkownika. Pole Typ danych Przyk\u0142ad Znaczenie id BIGINT \/ UUID 10452 trwa\u0142y identyfikator email VARCHAR user@firma.pl kontakt i logowanie password_hash VARCHAR hash bcrypt bezpiecze\u0144stwo status ENUM active stan konta created_at TIMESTAMP 2026-04-20 data utworzenia Tabela roles nie powinna przechowywa\u0107 logiki biznesowej w kodzie na sztywno. Lepiej przypisa\u0107 rol\u0119 w bazie. id nazwa roli 1 admin 2 manager 3 operator Relacja wiele-do-wielu mi\u0119dzy u\u017cytkownikiem a uprawnieniami jest standardem w wi\u0119kszych systemach. Przyk\u0142adowy wz\u00f3r oceny poziomu ryzyka konta mo\u017ce wygl\u0105da\u0107 tak: Zastosowanie Wz\u00f3r ocena ryzyka logowania R = aL + bF + cI Gdzie: Taki model stosuje si\u0119 np. przy wymuszaniu dodatkowego uwierzytelnienia. Parametry u\u017cytkownika a walidacja danych wej\u015bciowych, sp\u00f3jno\u015b\u0107 rekord\u00f3w i unikanie kosztownych b\u0142\u0119d\u00f3w Najwi\u0119cej problem\u00f3w nie wynika z braku danych, ale z ich z\u0142ej jako\u015bci. Typowe b\u0142\u0119dy: Walidacja musi wyst\u0119powa\u0107 na dw\u00f3ch poziomach: Sama walidacja frontendowa nie wystarcza. U\u017cytkownik mo\u017ce omin\u0105\u0107 formularz i wys\u0142a\u0107 \u017c\u0105danie bezpo\u015brednio do API. Przyk\u0142ad walidacji w Python J\u0119zyk Kod Python python\\nemail = input()\\n\\nif \\&#8221;@\\&#8221; not in email or len(email) &lt; 5:\\n print(\\&#8221;B\u0142\u0119dny adres\\&#8221;)\\nelse:\\n print(\\&#8221;OK\\&#8221;)\\n Przyk\u0142ad walidacji w C J\u0119zyk Kod C c\\n#include &lt;stdio.h&gt;\\n#include &lt;string.h&gt;\\n\\nint main() {\\n char email[100];\\n scanf(\\&#8221;%99s\\&#8221;, email);\\n\\n if (strchr(email, '@&#8217;) == NULL) {\\n printf(\\&#8221;Bledny adres\\\\n\\&#8221;);\\n } else {\\n printf(\\&#8221;OK\\\\n\\&#8221;);\\n }\\n return 0;\\n}\\n Przyk\u0142ad walidacji w C++ J\u0119zyk Kod C++ cpp\\n#include &lt;iostream&gt;\\n#include &lt;string&gt;\\n\\nint main() {\\n std::string email;\\n std::cin &gt;&gt; email;\\n\\n if (email.find(&#8217;@&#8217;) == std::string::npos) {\\n std::cout &lt;&lt; \\&#8221;Bledny adres\\\\n\\&#8221;;\\n } else {\\n std::cout &lt;&lt; \\&#8221;OK\\\\n\\&#8221;;\\n }\\n}\\n W systemach produkcyjnych walidacja jest znacznie bardziej rozbudowana: regex, regu\u0142y biznesowe, ograniczenia transakcyjne i kontrola integralno\u015bci relacyjnej. Zarz\u0105dzanie uprawnieniami i kontrola dost\u0119pu bez niebezpiecznych uproszcze\u0144 Bardzo cz\u0119sty b\u0142\u0105d to logika typu: if user == admin To dzia\u0142a tylko chwilowo. Gdy pojawia si\u0119 wi\u0119cej r\u00f3l, system zaczyna si\u0119 rozpada\u0107. Lepszy model to RBAC &#8211; Role-Based Access Control. Schemat dzia\u0142ania: Przyk\u0142ad: Operacja Wymagane uprawnienie usuni\u0119cie faktury invoice.delete podgl\u0105d raportu report.read eksport danych export.execute Dzi\u0119ki temu mo\u017cna doda\u0107 now\u0105 rol\u0119 bez zmian w kodzie aplikacji. W systemach finansowych lub medycznych stosuje si\u0119 dodatkowo zasad\u0119 najmniejszych uprawnie\u0144. U\u017cytkownik dostaje tylko to, co jest absolutnie konieczne. To ogranicza realne straty przy b\u0142\u0119dzie lub przej\u0119ciu konta. Parametry u\u017cytkownika w kontek\u015bcie bezpiecze\u0144stwa hase\u0142, sesji i historii operacji Has\u0142o nigdy nie powinno by\u0107 przechowywane w postaci jawnej. Poprawny proces: Najcz\u0119\u015bciej stosowane algoryt: SHA-256 bez dodatkowych mechanizm\u00f3w nie jest dzi\u015b wystarczaj\u0105cym zabezpieczeniem dla hase\u0142 u\u017cytkownik\u00f3w. Przyk\u0142ad w Python: J\u0119zyk Kod Python python\\nimport hashlib\\n\\nhaslo = \\&#8221;Test123\\&#8221;\\nhash_hasla = hashlib.sha256(haslo.encode()).hexdigest()\\nprint(hash_hasla)\\n To jest przyk\u0142ad edukacyjny, ale w praktyce nale\u017cy u\u017cywa\u0107 bcrypt lub Argon2. Warto te\u017c przechowywa\u0107: Brak tych danych cz\u0119sto oznacza brak mo\u017cliwo\u015bci analizy incydentu po ataku. Pu\u0142apki projektowe, kt\u00f3re p\u00f3\u017aniej kosztuj\u0105 najwi\u0119cej czasu i pieni\u0119dzy Najdro\u017csze b\u0142\u0119dy zwykle nie s\u0105 spektakularne. To drobne decyzje z pocz\u0105tku projektu. Przyk\u0142ady: Jeden login jako klucz g\u0142\u00f3wny Po zmianie adresu e-mail zaczyna si\u0119 problem z relacjami i histori\u0105 danych. Brak wersjonowania zmian Nie wiadomo, kto zmieni\u0142 limit kredytowy albo usun\u0105\u0142 dost\u0119p operatorowi. Nadmiar danych osobowych System zbiera informacje, kt\u00f3rych nie potrzebuje. To zwi\u0119ksza ryzyko prawne i koszt ochrony danych. Brak polityki wygasania sesji U\u017cytkownik zostawia zalogowane stanowisko i kto\u015b przejmuje dost\u0119p. Uprawnienia zapisane na sztywno w kodzie Ka\u017cda zmiana wymaga wdro\u017cenia produkcyjnego. Takie decyzje wygl\u0105daj\u0105 niewinnie na pocz\u0105tku, ale po roku utrzymania staj\u0105 si\u0119 realnym kosztem operacyjnym. FAQ Czy identyfikator u\u017cytkownika powinien by\u0107 adresem e-mail? Nie. Adres e-mail mo\u017ce si\u0119 zmieni\u0107. Identyfikator powinien by\u0107 trwa\u0142y i niezale\u017cny od danych biznesowych, najlepiej jako liczba lub UUID. Czy walidacja w JavaScript wystarcza? Nie. Frontend poprawia wygod\u0119 u\u017cytkownika, ale bezpiecze\u0144stwo musi by\u0107 wymuszane tak\u017ce po stronie backendu i bazy danych. Czy jedna rola dla jednego u\u017cytkownika to dobre rozwi\u0105zanie? Tylko w bardzo prostych systemach. W praktyce lepiej przygotowa\u0107 model umo\u017cliwiaj\u0105cy wiele r\u00f3l lub bezpo\u015brednie mapowanie uprawnie\u0144. Dlaczego przechowywanie historii logowania jest wa\u017cne? Pozwala wykrywa\u0107 przej\u0119cia kont, nietypowe logowania i analizowa\u0107 incydenty bezpiecze\u0144stwa po fakcie. Czy wszystkie ustawienia powinny by\u0107 w jednej tabeli? Nie. Dane identyfikacyjne, bezpiecze\u0144stwo, konfiguracja i historia dzia\u0142a\u0144 maj\u0105 r\u00f3\u017cne cele i powinny by\u0107 logicznie rozdzielone. Dobrze zaprojektowany model danych u\u017cytkownika nie jest dodatkiem do systemu, tylko jego fundamentem. Je\u017celi ta warstwa jest zrobiona \u017ale, problemy pojawiaj\u0105 si\u0119 wsz\u0119dzie: w bezpiecze\u0144stwie, raportowaniu, utrzymaniu i rozwoju aplikacji. Je\u017celi jest zrobiona poprawnie, wi\u0119kszo\u015b\u0107 dalszych decyzji staje si\u0119 po prostu prostsza. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1368,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24,1],"tags":[],"class_list":["post-1367","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kodowanie","category-poradnik"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1367"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1367\/revisions"}],"predecessor-version":[{"id":1369,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1367\/revisions\/1369"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1368"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}