Zabezpieczenia

Podstawą definiowania zabezpieczeń są pliki zawarte w podkatalogu security każdego modułu.

Plik security/ir.model.access.csv ma strukturę:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink

  • id - zewnętrzny identyfikator rekordu (znany również jako identyfikator XML). Powinien być unikalny w ramach modułu.
  • name - tytuł / opis. Ma tylko charakter informacyjny (zalecane by był unikalny). Oficjalne moduły stosują konwencję: tytuł to oddzielone kropką nazwy: modułu, modelu i grupy.
  • model_id:id - zewnętrzny identyfikator dla modelu, któremu dajemy dostęp. Modele mają identyfikatory XML generowane automatycznie przez ORM. Dla modelu todo.task, identyfikator to model_todo_task.
  • group_id:id - identyfikuje grupę zabezpieczeń, do której mamy uprawnienia. Najbardziej istotne są dostarczane przez moduł podstawowy (base). Na przykład grupa pracowników ma identyfikator base.group_user.
  • pola perm oznaczają dostęp do nadania, odczytu, zapisu, utworzenia lub odłączenia (usunięcia) dostępu.

To co się wczytało po zainstalowaniu modułu można oglądać od zaplecza:

    Settings | Technical | Security | Access Controls List

Z kolei w pliku security/todo_access_rules.xml - są reguły dostępu do rekordów (ir.rule). Pozwalają one ograniczać userom dostęp do danych w tabelach.

Przykład:

from odoo.exceptions import AccessError

def test_record_rule(self): 
  Todo = self.env['todo.task'] 
  task = Todo.sudo().create({'name': 'Admin Task'}) 
  # .sudo() - wykonanie tego co zarezerwowane dla administratora 
  with self.assertRaises(AccessError): 
    Todo.browse([task.id]).name

Jak widać w powyższym przykładzie - wykonanie operacji niedostępnych dla aktualnego użytkownika jest możliwe z użyciem sudo().

Dodatkowe informacje:

Algorytm sprawdzania uprawnień

Podstawowym mechanizmem bezpieczeństwa są uprawnienia do modeli ustawiane w plikach ir.model.access.csv.Reguły te mogą odnosić się do użytkowników lub grup. użytkownik może należeć do wielu grup. Uprawnienia grup do których należy sumują się. Uprawnienia przyznaje się na tworzenie, odczyt, zapis (edycja / aktualizacja) i usuwanie (zob. rozdział "Struktura systemu Odoo" - podrozdział poświęcony tabelom IR).

Z kolei reguły odnoszące się do rekordów (ir.rule) zawierają pole domeny, określające warunek stosowalności reguły. Gdy jakiś rekord spełnia warunek (domain), jest on dostępny na warunkach określonych wartościami pól odczyt/zapis/zmiana/usuwanie.

Gdy jakaś reguła nie ma podanej grupy - odnosi się do wszystkich grup. Mówimy zatem o regułach globalnych i grupowych. Globalne reguły odnoszące się do rekordów są traktowane jako restrykcje: rekord musi spełniać je wszystkie aby był dostępny. Reguły grupowe są sumowane. Wystarczy, że jedna z nich dopuszcza operację, by była ona dostępna.

Mechanizm uprawnień można stosować do kontroli widoczności poszczególnych elementów systemu (zob Ustawienia -> Techniczne):

  • widoczność poszczególnych pól ograniczamy, podając w definicji formularza (znacznik field) domenę (domain) i grupę (group)
  • reguły przejścia (przepływu pracy / workflow) ograniczamy podając w definicji grupę umożliwiającą przejści (użytkownik, który nie nalezy do grupy nie może wykonać operacji)
  • operacje menu mogą być widoczne tylko dla zdefiniowanych grup
  • raporty mogą być dostępne tylko dla wybranych grup
  • akcje mogą być widoczne tylko dla wybranych grup

By sprawdzić uprawnienia użytkownika system działa następującego:

  • Sprawdza uprawnienia dostępu użytkownika w ir.model.access. Niepowodzenie oznacza, że użytkownik nie uzyska dostępu do modelu.
  • Sprawdza się globalne reguły dla modelu. Jeśli rekord pasuje do domeny podanej w którejś regule ograniczającej wykonanie operacji - następuje odmowa dostępu.
  • Sprawdza się reguły grupowe. Jeśli zbiór reguł nie jest pusty, a żadna z tych reguł nie dopuszcza wykonania operacji - następuje odmowa dostępu.