locks

Użytkownicy, role i uprawnienia w Drupalu - najważniejsze informacje dla Drupal developera

Drupal jest wybierany jako platforma do budowy serwisów internetowych m.in. ze względu na jego elastyczność. Jeśli chcesz system idealnie dopasowany do Twojego modelu biznesowego i lepszy niż systemy konkurencji, to Drupal idealnie się tu sprawdzi. Jednym z obszarów, które możesz dostosować w Drupalu, jest system uprawnień dla użytkowników. Poświęć kilka minut i zapoznaj się z możliwościami zarządzania uprawnieniami w Drupalu.

Ogólne informacje

Drupal pozwala na zarządzanie dostępem z poziomu panelu administratora oraz z poziomu kodu. W tym wpisie przedstawię te dwie możliwości oraz najczęstsze przykłady ich użycia.

Role i uprawnienia w rdzeniu Drupala

Jeśli pierwszy raz masz styczność z Drupalem i jego systemem uprawnień, to powinieneś wiedzieć, że istnieją 3 elementy służące do nadawania uprawnień:

  1. Użytkownik
  2. Rola
  3. Uprawnienie

Instalując Drupala, tworzy się w systemie konto głównego administratora (identyfikator 1 w bazie danych). Można go porównać do użytkownika root w systemach uniksowych. Użytkownik ten ma dostęp do wszystkich podstron i ustawień w systemie.

Możesz dodać do systemu kolejnych użytkowników. Mogą to być np. redaktorzy odpowiedzialni za tworzenie treści albo moderatorzy decydujący czy publikować dodane komentarze.

Jeśli chcesz danemu użytkownikowi przypisać jakieś uprawnienie, to robi się to pośrednio, przez przypisanie mu roli. Nie ma w Drupalu powiązania użytkownika z uprawnieniami. Jest powiązanie użytkownik-rola oraz rola-uprawnienie.

schemat

Jak dodać rolę redaktora i przypisać jej odpowiednie uprawnienia

To chyba najczęstszy przypadek spotykany w Drupalu. Potrzebujemy wpuścić do naszego systemu użytkowników, ale chcemy im ograniczyć uprawnienia tylko do zarządzania treścią. Nie chcemy dawać uprawnień do zmian konfiguracji systemu czy do dodawania kolejnych użytkowników.

Aby to osiągnąć należy wykonać następujące kroki:

  1. Na stronie “/admin/people/roles/add/“ dodajemy nową rolę.
  2. Na stronie “/admin/people/permissions/“ przypisujemy do nowej roli wybrane uprawnienia. Te dotyczące treści znajdziesz w sekcji “Node”. Poniżej znajdziesz więcej informacji o liście uprawnień.
  3. Na stronie “/admin/people/“ przypisz wybranego użytkownika do nowej roli.

Następnie zaloguj się na konto wybranego użytkownika i sprawdź czy ma odpowiednie uprawnienia. Może potrzebujesz je rozszerzyć lub zabrać. Jeśli nie znasz dobrze systemu uprawnień w Drupalu, to taki test z logowaniem na konto użytkownika zawsze warto wykonać.

Nie musisz znać hasła do konta użytkownika, na które się chcesz zalogować. Wystarczy zainstalować moduł Masquerade. Dzięki niemu przelogujesz się na konto dowolnego użytkownika.

Przegląd uprawnień w rdzeniu Drupala

Wchodząc pierwszy raz na stronę “/admin/people/permissions/“ można się trochę przestraszyć. To chyba najdłuższa strona konfiguracyjna w Drupalu.

Zacznijmy od nagłówka tabeli. W pierwszej kolumnie zobaczysz zawsze słowo “PERMISSION”. W kolejnych komórkach pierwszego wiersza będą nazwy ról. Im więcej ról dodasz (możesz je dodać na stronie /admin/people/roles/add/) tym więcej ich zobaczysz w tej tabeli.

Następnie patrząc na całość pierwszej kolumny, zobaczysz długą listę uprawnień. Uprawnienia są podzielone na sekcje. Sekcje to nazwy modułów. Wspomniana wcześniej sekcja “Node” nazywa się tak, ponieważ uprawnienia w tej sekcji są zdefiniowane w module “node” (znajdziesz go na dysku w katalogu core/modules/node).

Niektóre sekcje mają tylko jedno uprawnienie, np. sekcja “Block” ma tylko uprawnienie “Administer blocks”. Inne mają ich znacznie więcej.

Jeśli pierwszy raz zajmujesz się ustawieniami uprawnień w Drupalu, to sugeruję przeczytanie nazw wszystkich uprawnień. Nazwy te same z siebie tłumaczą, do czego służy uprawnienie.

Anonymous & Authenticated

W Drupalu istnieją dwie role systemowe, których nie można usunąć:

  1. Anonymous User
  2. Authenticated User

Pierwsza z tych ról odpowiada za wszystkich niezalogowanych użytkowników. Dla przykładu: jeśli chcesz dodać możliwość przeglądania profili użytkowników wszystkim niezalogowanym dla uprawnienia “View user information”, zaznacz checkbox w kolumnie “Anonymous User”.

“Authenticated User” to rola przypisywana wszystkim zalogowanym użytkownikom. Tutaj istotne jest zrozumienie dziedziczenia uprawnień. Jeśli przypiszesz jakieś uprawnienie dla “Authenticated User”, to wszystkie inne role (oprócz anonymous) też od razu będą miały to uprawnienie.

Przykład: masz w systemie rolę “Editor”. Przypisujesz uprawnienie “View user information” do roli “Authenticated User”. Wszyscy o roli “Editor” też dostaną do uprawnienie, ponieważ też są traktowani jako zalogowany użytkownik.

Pamiętaj ponadto, że jeśli zaznaczysz jakieś uprawnienie dla roli Anonymous (np. znowu “View user information”), ale nie zaznaczysz go dla “Authenticated User”, to zalogowani użytkownicy nie dostaną dostępu do wybranej sekcji (“View user information” - nie będą mieli dostępu do profili użytkowników).

Warto zapamiętać

  • W Drupalu możesz dodać nieograniczoną liczbę ról.
  • Lista uprawnień jest definiowana przez moduły w plikach modulename.permissions.yml (o tym więcej w dalszej części tekstu). 
  • Role “Atuhenticated” i “Anonymous” są rozłączne - jak coś zaznaczysz tylko dla “Anonymous” to zalogowani nie dostaną tego uprawnienia.
  • Do testowania uprawnień warto skorzystać z modułu Masquerade.

Własne uprawnienie w kodzie

Zdarza się potrzeba zdefiniowania własnych uprawnień, np. do stron administracyjnych definiowanych przez nowe moduły lub do zmodyfikowania dostępu do stron definiowanych przez rdzeń Drupala.

Jak zdefiniować uprawnienie

Wystarczy dodać plik modulename.permissions.yml w nowym module (lub w istniejącym, jeśli masz już stworzone jakieś własne moduły). Jeśli nie wiesz, jak tworzyć swoje moduły, to odsyłam do tej strony.

Plik z uprawnieniami to plik w formacie YML. Prosty przykład znajdziesz w module Popup Message, dokładnie tutaj.

uprawenina

W pliku definiuje się unikalną nazwę uprawnienia (np. “popup message administration”), a następnie nazwy wyświetlane na stronie “/admin/people/permissions/“. Można podać tytuł w parametrze “title” oraz dodatkowo bardziej szczegółowy opis w parametrze “description”.

Tyle wystarczy do zdefiniowania nowych uprawnień. Po utworzeniu pliku i wyczyszczeniu cache, zobaczysz nowe uprawnienia na stronie “/admin/people/permissions/“.

Jak użyć uprawnienia

Najczęściej uprawnienia używane są przy definiowaniu routingu. Zajrzyj do pliku.

W sekcji “requirements” można dodać parametr "permission”. W ten sposób można zdefiniować o tym, z jakim uprawnieniem użytkownicy (a właściwie role) mogą wyświetlać stronę zdefiniowaną w routingu.

Drugim sposobem jest sprawdzenie uprawnienia w kodzie. Obiekt użytkownika w Drupalu posiada metodę “hasPermission”. W ten sposób możemy sprawdzić, czy dany użytkownik ma wybrane uprawnienie.

// Get the current user
$user = \Drupal::currentUser();
// Check for permission
if ($user->hasPermission('display popup message')) {
// Do something.
}

Tu warto zajrzeć do metody hasPermission. Jak widać, jest tam sprawdzany identyfikator użytkownika. Jeśli identyfikator równy jest 1, to użytkownik dostaje dostęp bez sprawdzania dalej, czy ma wybrane role.

Jak sprawdzić, czy użytkownik posiada rolę

Drupal ma też gotową metodę do sprawdzenia czy dany użytkownik posiada przypisaną rolę o określonej nazwie. Poniżej przykład jak to możesz zrobić w kodzie.

// Get the current user
$user = \Drupal::currentUser();
// Check for permission
if ($user->hasRole('editor')) {
// Do something.
}

Dodatkowo istnieją jeszcze metody związane z rolami Authenticated i Anonymous:

  • $user-> isAuthenticated();
  • $user-> isAnonymous();

Jak sprawdzić uprawnienia do operacji na encji

W kodzie aplikacji możemy też sprawdzać uprawnienia do operacji na wybranych encjach (np. Node czy User). Możemy wykonywać pewne operacje np. zależnie od tego, czy użytkownik ma prawo do edycji danej encji czy do wyświetlania encji.

Encje w Drupalu mają metodę access($operation = 'view', AccountInterface $account = NULL, $return_as_object = FALSE). Prosty przykład wykorzystania znajduje się poniżej:

$nid = 545;
$node = \Drupal\node\Entity\Node::load($nid);
$user = \Drupal::currentUser();
if ($node->access('edit', $user)) {
// Do something
}

Definiowanie uprawnień do treści

Drupal umożliwia zarządzanie dostępem do wyświetlania czy edycji na poziomie pojedynczego wpisu (node). Ten temat został bardzo dobrze opisany w innym naszym wpisie blogowym. Grzegorz Pietrzak opisał to w artykule Drupal Node grants.

Gotowe moduły do Drupala związane z uprawnieniami

Istnieje już wiele gotowych modułów rozszerzających możliwości rdzenia Drupala. Warto się z nimi zapoznać, zanim zaczniesz pisać własne moduły związane z uprawnieniami.

Poniżej lista kilku wybranych przeze mnie modułów, które warto sprawdzić i przetestować: 

Zajrzyj też na stronę i zobacz inne moduły. Może jeszcze coś z nich Ci się przyda.

Podsumowanie

Drupal jest bardzo elastycznym systemem. Już patrząc na same możliwości dotyczące uprawnień można zobaczyć ogrom możliwości konfiguracji. Jeśli budujesz duży serwis, gdzie będzie wiele poziomów redaktorów albo wewnętrzną aplikację (np. system intranetowy), gdzie użytkownicy muszą mieć ograniczone uprawnienia, to Drupal sprawdzi się tu bardzo dobrze.

Jeśli potrzebujesz wsparcia specjalistów Drupala dotyczącego uprawnień lub innych zagadnień, to skorzystaj z naszego zespołu programistów Drupala.

Najlepsze praktyki