Jak wykryć, czy użytkownik jest superużytkownikiem?

20

Aby ustalić, czy gość jest gościem , używamy czegoś takiego:

if ($user->guest) {
echo 'Hello, guest!';
}

Teraz, jeśli chcę ustalić, czy użytkownik jest zarejestrowanym SuperUżytkownikiem (Administratorem), czy nie, jaki byłby tego kod?

Mam niektóre zewnętrzne pliki PHP, które nie chcę być dostępne dla nikogo oprócz SuperUserów mojej witryny Joomla. Próbuję zabezpieczyć pliki, importując CMS Joomla.

saibbyweb
źródło
1
Zabawne, że potrzebowałem tej ostatniej nocy i po prostu googlowałem, dopóki nie znalazłem rozwiązania. W moim przypadku przesłoniłem dane wyjściowe z plików RSFiles, więc pasek narzędzi pojawia się tylko dla administratorów.
Brian Peat
1
W rzeczywistości $ user-> get ('isRoot'), który jest w zaakceptowanej odpowiedzi, nie powinien być używany. Najprawdopodobniej w najnowszych wersjach Joomla (3.6 i późniejszych) nie będzie działać, gdy zostanie wywołany w ten sposób poza JUser :: authorize (). Zamiast tego użyj $ user-> autoryzuj („tutaj twoje parametry”), jak odpowiedź dev-m.
FFrewin

Odpowiedzi:

28

kody te określą, czy aktualnie zalogowany użytkownik jest superużytkownikiem, czy nie -

$user = JFactory::getUser();
$isroot = $user->authorise('core.admin');

kod ten sprawdzi, co jest mapowane na uprawnienie „Superużytkownik” w konfiguracji globalnej, a nie tylko na poziomie komponentu. Sprawdź to sam, porównując z innymi sposobami.

dev-m
źródło
2
Wyjaśnienie w tej odpowiedzi jest nieco słabe, ale myślę, że core.adminjest to lepsze pozwolenie na sprawdzenie niż core.edit.
Brilliand
1
Nie zgadzam się. core.admin to uprawnienia używane do kontrolowania dostępu do konfiguracji globalnej, więc jest to odpowiedni sposób sprawdzenia, czy użytkownik jest superadministratorem. Jeśli sprawdzisz, czy grupa 8 odpowiada przyjętej odpowiedzi, jeśli Joomla! jeśli zdecydujesz się losowo ustawić go ze względów bezpieczeństwa, twój skrypt się zepsuje. Zawsze koduj z myślą o zmianie. Chyba że nigdy nie planujesz aktualizacji.
Mathew Lenning
Jest to zdecydowanie najlepsze dopasowanie do testu SuperUser. Sprawdzi zarówno bezpieczeństwo awaryjne, jak i uprawnienia SuperUser. github.com/joomla/joomla-cms/blob/staging/libraries/joomla/user/ ... Inną alternatywą jest $ user-> get ('isRoot'), który zakłada, że ​​autoryzacja została już użyta do wypełnienia stanu isRoot. IsRoot może być używany bezpośrednio, ponieważ jest chronioną właściwością. github.com/joomla/joomla-cms/blob/staging/administrator/…
Peter Wiseman
Aby wyjaśnić wątpliwości, czy ten kod jest poprawny, czy nie: ten kod jest używany w jądrze Joomla (Joomla 3.5.1), aby sprawdzić, czy użytkownik jest superadministratorem, czy nie. Można go znaleźć w linii 747 libraries/joomla/user/user.phppliku. To jest ten:$iAmSuperAdmin = $my->authorise('core.admin');
itoctopus
8

Aby określić status „superużytkownika”, musisz to sprawdzić $user->isRoot. Ta właściwość jest ustawiana po pierwszym sprawdzeniu autoryzacji i wykryciu użytkownika jako superadministratora.

Jednak zwykle lepiej jest sprawdzić, czy użytkownik ma określone uprawnienia, jak opisano w innych odpowiedziach.

Bakual
źródło
3
Zakłada się, że $ user-> authorize () został już wywołany przez coś innego w celu wypełnienia właściwości isRoot. Należy również pamiętać, że właściwość isRoot jest chroniona, dlatego należy uzyskać do niej dostęp poprzez $ user-> get ('isRoot').
Peter Wiseman,
6

Spróbuj tego,

$user  = JFactory::getUser();

$user_groups = $user->groups;

print_r($user_groups);

To zwróci tablicę, domyślnie użytkownicy Joomla Admin Super admin (Grupy 8) i Administrator (Grupa 7).

Możesz sprawdzić, czy tablica ma dowolną z tych wartości, powinien to być użytkownik Administrator. Jeśli masz utworzoną grupę użytkowników niestandardowych, musisz również sprawdzić #__usergroups parent Id.

Mam nadzieję, że to pomoże..

Jobin Jose
źródło
6

Możesz użyć warunku, aby odmówić, jeśli nie ma go w określonej grupie.

$user = JFactory::getUser();
$groups = $user->groups;

if (in_array(8, $groups)):

 //only enter if the user is in the group 8 (group 8 = Super-Administrator)

endif;
Adam Tremblay Lavoie
źródło
1
Magiczna liczba nie jest świetnym rozwiązaniem. Możesz przyznać uprawnienia superadministratora dowolnej grupie i / lub usunąć domyślną grupę superadministratorów.
David Hayes
Użyłem czegoś podobnego if(in_array(8, $user->groups))i zadziałało dla mnie
Linga,
4

Wypróbuj poniższy kod, aby sprawdzić, czy użytkownik logowania jest superadministratorem lub innymi użytkownikami ...

$user = JFactory::getUser();
$isAdmin = $user->get('isRoot');
if ($isAdmin) {
echo 'You are an Administrator';
}
else  {
echo 'You are not Administrator';
}

OR

function isSuperAdmin()
{
  $user = JFactory::getUser();
  return $user->get('isRoot');
}    

if (isSuperAdmin()) 
{
  echo 'You are an Administrator';
}
else  {
  echo 'You are not Administrator';
}
PCMShaper
źródło
1
Właściwie nie należy używać $ user-> get ('isRoot'). Najprawdopodobniej w najnowszych wersjach Joomla (3.6 i późniejszych) nie będzie działać, gdy zostanie wywołany w ten sposób poza JUser :: authorize (). Zamiast tego użyj $ user-> autoryzuj („tutaj twoje parametry”), jak odpowiedź dev-m.
FFrewin
Najpierw przetestuję to, dzięki za zwrócenie uwagi. :)
saibbyweb
1
$user->get('isRoot');nie działa dla J3.6.2.
saibbyweb
2

Joomla @since 3.2, pole UserGroupList używa tego do sprawdzenia:

$isSuperUser = JFactory::getUser()->authorise('core.admin');
Pedro Bicudo Maschio
źródło
Ta odpowiedź jest bardzo podobna do odpowiedzi @ dev-m .
Farahmand,
@Farahmand masz rację, właśnie dodałem, aby potwierdzić, która metoda jest preferowana przez Joomla i że nadal obowiązuje dla Joomla w wersji 3+
Pedro Bicudo Maschio
W porządku. W każdym razie pytanie zostało już oznaczone joomla-3.x .
Farahmand,