---
# System prepended metadata

title: System uprawnień

---

# System uprawnień

1. Wymagania: 
    * każdy użytkownik jest przypisany do grupy (do żadnej / wielu),
    * każda grupa ma jakąś rolę (jedną lub więcej?),
    * każda rola ma przypisane uprawnienia (jedno lub więcej),
    * użytkownik nie ma bezpośrednio przypisanych mu uprawnień - wszystko idzie przez łańcuch **<Użytkownik -> Grupa -> Rola -> Uprawnienie>**.
    
2. Kluczowe byty w systemie uprawnień: 
    * USER,
    * ACCOUNT,
    * GROUP,
    * ROLE,
    * PERMISSION.

3. Uwagi techniczne: 
    * przy zmianie w łańcuchu nic się nie dzieje, dopiero przy SELECT'ie robimy JOIN'a po wszystkich tabelach i zwracamy wynik,
    * nie dajemy żadnej flagi oznaczającej nieaktywowane konto, wtedy user będzie dostawał pustą listę uprawnień dopóki administrator nie uzupełni jego danych podstawowych (w praktyce nie powinno dojść do takiego przypadku, bo jest jeden formularz do uzupełnienia na froncie).

4. TODO: 
    - [ ] wymyślić strukturę ENUM'ów do tworzenia praw,
    - [ ] stworzyć klasę, która będzie przechowywać w module aaa wszystkie uprawnienia (w v09 nie dzielimy uprawnienia na moduły),
    - [ ] usunąć wszystkie wystąpienia związane z uprawnieniami z modułu USR (np. UserPermissionsRestController),
    - [ ] usunąć powiązanie pomiędzy grupą a uprawnieniem,
    - [ ] przypisać encje do konkretnych modułów (ACCOUNT do AAA, USER do USR, GROUP do USR itd),
    - [ ] jak zabezpieczyć bazę danych, żeby nie można było łatwo zmodyfikować np. tabel ROLE_PERMISSION, GROUP_ROLE, GROUP_USER i tym samym za pomocą bazy nadać dodatkowe uprawnienia użytkownikowi.

5. Diagram ERD:

![](https://i.imgur.com/8dbR5a7.png)

<details>
    <summary>
        Kliknij by zobaczyć kod w PlantUML
    </summary>

```mediawiki=
@startuml

title System uprawnień

entity "USER" as e1 {
  * user_id
  --
  * jakieś inne atrybuty
}

entity "GROUP" as e2 {
  * group_id
  --
  * jakieś inne atrybuty
}

entity "ROLE" as e3 {
  * role_name
  --
  role_desc
}

entity "ACCOUNT" as e5 {
  * user_id
  --
  * jakieś inne atrybuty
}

entity "GROUP_USER" as e6 {
  * user_id - foreign key
  * group_id - foreign key
}


entity "GROUP_ROLE" as e8 {
  * group_id - foreign key
  * role_name - foreign key
}

entity "ROLE_PERMISSION" as e9 {
  * role_name - foreign key
  * permission_name - foreign key
}

e1 |o..o| e5

e1 |o..o{ e6
e2 |o..o{ e6


e2 |o..o{ e8
e3 |o..o{ e8

e3 |o..o{ e9

@enduml
```
</details>