
Parametry użytkownika
System informatyczny rzadko działa w oderwaniu od człowieka. Nawet najprostsza aplikacja musi wiedzieć, kto korzysta z usługi, jakie ma uprawnienia, jakie preferencje zapisu danych, w jakim języku pracuje i jakie operacje są dla niego dozwolone. Bez tego nie da się poprawnie zbudować logowania, personalizacji ani bezpieczeństwa. W praktyce cała ta warstwa sprowadza się do dobrze zaprojektowanych danych opisujących Parametry użytkownika.
Spis Treści
| Pole | Typ danych | Przykład | Znaczenie |
|---|---|---|---|
| id | BIGINT / UUID | 10452 | trwały identyfikator |
| VARCHAR | user@firma.pl | kontakt i logowanie | |
| password_hash | VARCHAR | hash bcrypt | bezpieczeństwo |
| status | ENUM | active | stan konta |
| created_at | TIMESTAMP | 2026-04-20 | data utworzenia |
Tabela roles nie powinna przechowywać logiki biznesowej w kodzie na sztywno. Lepiej przypisać rolę w bazie.
| id | nazwa roli |
|---|---|
| 1 | admin |
| 2 | manager |
| 3 | operator |
Relacja wiele-do-wielu między użytkownikiem a uprawnieniami jest standardem w większych systemach.
Przykładowy wzór oceny poziomu ryzyka konta może wyglądać tak:
| Zastosowanie | Wzór |
|---|---|
| ocena ryzyka logowania | R = aL + bF + cI |
Gdzie:
L— liczba nieudanych logowańF— częstotliwość zmian urządzeńI— nietypowość adresu IPa, b, c— wagi ustalone przez system
Taki model stosuje się np. przy wymuszaniu dodatkowego uwierzytelnienia.
Parametry użytkownika a walidacja danych wejściowych, spójność rekordów i unikanie kosztownych błędów
Najwięcej problemów nie wynika z braku danych, ale z ich złej jakości.
Typowe błędy:
- brak walidacji adresu e-mail
- możliwość ustawienia pustego hasła
- zapis ujemnego limitu transakcji
- niespójna strefa czasowa
- przechowywanie dat jako tekst
Walidacja musi występować na dwóch poziomach:
- po stronie aplikacji
- po stronie bazy danych
Sama walidacja frontendowa nie wystarcza. Użytkownik może ominąć formularz i wysłać żądanie bezpośrednio do API.
Przykład walidacji w Python
| Język | Kod |
|---|---|
| Python | python\nemail = input()\n\nif \"@\" not in email or len(email) < 5:\n print(\"Błędny adres\")\nelse:\n print(\"OK\")\n |
Przykład walidacji w C
| Język | Kod |
|---|---|
| C | c\n#include <stdio.h>\n#include <string.h>\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 |
Przykład walidacji w C++
| Język | Kod |
|---|---|
| C++ | cpp\n#include <iostream>\n#include <string>\n\nint main() {\n std::string email;\n std::cin >> email;\n\n if (email.find('@') == std::string::npos) {\n std::cout << \"Bledny adres\\n\";\n } else {\n std::cout << \"OK\\n\";\n }\n}\n |
W systemach produkcyjnych walidacja jest znacznie bardziej rozbudowana: regex, reguły biznesowe, ograniczenia transakcyjne i kontrola integralności relacyjnej.
Zarządzanie uprawnieniami i kontrola dostępu bez niebezpiecznych uproszczeń
Bardzo częsty błąd to logika typu:
if user == admin
To działa tylko chwilowo. Gdy pojawia się więcej ról, system zaczyna się rozpadać.
Lepszy model to RBAC – Role-Based Access Control.
Schemat działania:
- użytkownik ma przypisaną rolę
- rola ma przypisane uprawnienia
- aplikacja sprawdza uprawnienie, nie nazwę roli
Przykład:
| Operacja | Wymagane uprawnienie |
|---|---|
| usunięcie faktury | invoice.delete |
| podgląd raportu | report.read |
| eksport danych | export.execute |
Dzięki temu można dodać nową rolę bez zmian w kodzie aplikacji.
W systemach finansowych lub medycznych stosuje się dodatkowo zasadę najmniejszych uprawnień. Użytkownik dostaje tylko to, co jest absolutnie konieczne.
To ogranicza realne straty przy błędzie lub przejęciu konta.
Parametry użytkownika w kontekście bezpieczeństwa haseł, sesji i historii operacji
Hasło nigdy nie powinno być przechowywane w postaci jawnej.
Poprawny proces:
- użytkownik podaje hasło
- system generuje hash
- w bazie zapisywany jest tylko hash
- podczas logowania porównywany jest wynik funkcji skrótu
Najczęściej stosowane algoryt:
- bcrypt
- Argon2
- scrypt
SHA-256 bez dodatkowych mechanizmów nie jest dziś wystarczającym zabezpieczeniem dla haseł użytkowników.
Przykład w Python:
| Język | Kod |
|---|---|
| Python | python\nimport hashlib\n\nhaslo = \"Test123\"\nhash_hasla = hashlib.sha256(haslo.encode()).hexdigest()\nprint(hash_hasla)\n |
To jest przykład edukacyjny, ale w praktyce należy używać bcrypt lub Argon2.
Warto też przechowywać:
- datę ostatniej zmiany hasła
- liczbę błędnych logowań
- aktywne sesje
- identyfikator urządzenia
- historię krytycznych operacji
Brak tych danych często oznacza brak możliwości analizy incydentu po ataku.
Pułapki projektowe, które później kosztują najwięcej czasu i pieniędzy
Najdroższe błędy zwykle nie są spektakularne. To drobne decyzje z początku projektu.
Przykłady:
Jeden login jako klucz główny
Po zmianie adresu e-mail zaczyna się problem z relacjami i historią danych.
Brak wersjonowania zmian
Nie wiadomo, kto zmienił limit kredytowy albo usunął dostęp operatorowi.
Nadmiar danych osobowych
System zbiera informacje, których nie potrzebuje. To zwiększa ryzyko prawne i koszt ochrony danych.
Brak polityki wygasania sesji
Użytkownik zostawia zalogowane stanowisko i ktoś przejmuje dostęp.
Uprawnienia zapisane na sztywno w kodzie
Każda zmiana wymaga wdrożenia produkcyjnego.
Takie decyzje wyglądają niewinnie na początku, ale po roku utrzymania stają się realnym kosztem operacyjnym.
FAQ
Czy identyfikator użytkownika powinien być adresem e-mail?
Nie. Adres e-mail może się zmienić. Identyfikator powinien być trwały i niezależny od danych biznesowych, najlepiej jako liczba lub UUID.
Czy walidacja w JavaScript wystarcza?
Nie. Frontend poprawia wygodę użytkownika, ale bezpieczeństwo musi być wymuszane także po stronie backendu i bazy danych.
Czy jedna rola dla jednego użytkownika to dobre rozwiązanie?
Tylko w bardzo prostych systemach. W praktyce lepiej przygotować model umożliwiający wiele ról lub bezpośrednie mapowanie uprawnień.
Dlaczego przechowywanie historii logowania jest ważne?
Pozwala wykrywać przejęcia kont, nietypowe logowania i analizować incydenty bezpieczeństwa po fakcie.
Czy wszystkie ustawienia powinny być w jednej tabeli?
Nie. Dane identyfikacyjne, bezpieczeństwo, konfiguracja i historia działań mają różne cele i powinny być logicznie rozdzielone.
Dobrze zaprojektowany model danych użytkownika nie jest dodatkiem do systemu, tylko jego fundamentem. Jeżeli ta warstwa jest zrobiona źle, problemy pojawiają się wszędzie: w bezpieczeństwie, raportowaniu, utrzymaniu i rozwoju aplikacji. Jeżeli jest zrobiona poprawnie, większość dalszych decyzji staje się po prostu prostsza.
Źródło Foto: Freepik


