Как определить, является ли пользователь суперпользователем?

20

Чтобы определить, является ли посетитель гостем , мы используем что-то вроде этого:

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

Теперь, если я хочу определить, является ли посетитель зарегистрированным суперпользователем (администратором) или нет, каким будет код для этого?

У меня есть несколько внешних файлов PHP, которые я не хочу, чтобы кто-то был доступен, кроме суперпользователей моего сайта Joomla. Просто пытаюсь обезопасить файлы, импортировав Joomla CMS.

saibbyweb
источник
1
Забавно, я нуждался в этом прошлой ночью и просто гуглил, пока не нашел решение. В моем случае я переопределял вывод RSFiles, поэтому панель инструментов отображается только для администраторов.
Брайан Пит
1
На самом деле $ user-> get ('isRoot'), который находится в принятом ответе, не должен использоваться. Скорее всего, в последних версиях Joomla (3.6 и новее) он не будет работать при таком вызове вне JUser :: authorize (). Вместо этого используйте $ user-> authorize ('ваши параметры здесь'), как и ответ dev-m.
FFrewin

Ответы:

28

эти коды будут определять, является ли текущий вошедший в систему пользователь суперпользователем или нет -

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

этот код будет проверять, что сопоставлено с разрешением «Суперпользователь» в глобальной конфигурации, а не только на уровне компонента. Проверьте сами, сравнивая с другими способами.

DEV-м
источник
2
Объяснение в этом ответе немного слабое, но я думаю core.admin, что лучше проверить, чем core.edit.
Brilliand
1
Я не согласен. core.admin - это разрешение, используемое для управления доступом к глобальной конфигурации, поэтому это подходящий способ проверить, является ли пользователь супер-администратором. Если вы проверите для группы 8, как принятый ответ, если Joomla! когда-нибудь решит рандомизировать его ради безопасности, ваш сценарий сломается. Всегда используйте код с учетом изменений. Если вы никогда не собираетесь обновляться.
Мэтью Леннинг
Это явно лучшее соответствие для проверки SuperUser. Он проверит как на отказоустойчивость, так и на разрешение SuperUser. github.com/joomla/joomla-cms/blob/staging/libraries/joomla/user/… Другой альтернативой является $ user-> get ('isRoot'), который предполагает, что авторизация уже использовалась для заполнения состояния isRoot. IsRoot может использоваться напрямую, поскольку это защищенное свойство. github.com/joomla/joomla-cms/blob/staging/administrator/…
Питер Уайзман
Просто чтобы устранить любые сомнения относительно того, является ли этот код правильным или нет: этот код используется в ядре Joomla (Joomla 3.5.1), чтобы проверить, является ли пользователь супер-администратором или нет. Вы можете найти его в строке 747 libraries/joomla/user/user.phpфайла. $iAmSuperAdmin = $my->authorise('core.admin');
Вот
8

Чтобы определить статус «Супер пользователя», вы должны проверить $user->isRoot. Это свойство устанавливается после выполнения первой проверки авторизации и обнаружения пользователя с правами суперпользователя.

Однако обычно вам действительно лучше проверить, есть ли у пользователя определенные разрешения, как описано в других ответах.

Bakual
источник
3
Это предполагает, что $ user-> authorize () уже был вызван чем-то другим для заполнения свойства isRoot. Также обратите внимание, что свойство isRoot защищено, поэтому доступ к нему должен осуществляться через $ user-> get ('isRoot').
Питер Уайзман
6

Попробуй это,

$user  = JFactory::getUser();

$user_groups = $user->groups;

print_r($user_groups);

Это вернет массив: по умолчанию пользователи Joomla Admin - супер администратор (группы 8) и администратор (группа 7).

Вы можете проверить, что в массиве есть любое из этих значений, тогда это должен быть пользователь с правами администратора. Если вы создали группу пользовательских пользователей, то вам тоже нужно проверить #__usergroups parent Id.

Надеюсь, это поможет..

Джобин Хосе
источник
6

Вы можете использовать условие, чтобы отказать любому, кто не принадлежит к определенной группе.

$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;
Адам Тремблай Лавуа
источник
1
Магическое число не является отличным решением. Вы можете дать разрешения Super Admin любой группе и / или удалить группу Super Admin по умолчанию.
Дэвид Хейс,
Я использовал что-то вроде, if(in_array(8, $user->groups))и это сработало для меня
Linga
4

Попробуйте приведенный ниже код, чтобы проверить, является ли логин супер администратором или другими пользователями ...

$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
источник
1
На самом деле $ user-> get ('isRoot') не должен использоваться. Скорее всего, в последних версиях Joomla (3.6 и более поздних) он не будет работать при вызове таким образом вне JUser :: authorize (). Вместо этого используйте $ user-> authorize ('ваши параметры здесь'), как и ответ dev-m.
FFrewin
Я проверю это в первую очередь, спасибо за указание. :)
saibbyweb
1
$user->get('isRoot');не работает для J3.6.2.
saibbyweb
2

Joomla @since 3.2, поле UserGroupList использует это для проверки:

$isSuperUser = JFactory::getUser()->authorise('core.admin');
Педро Бикудо Маскио
источник
Этот ответ очень похож на ответ @ dev-m .
Фараманд
@Farahmand вы правы, я просто добавил, чтобы подтвердить, какой метод Joomla предпочтителен и что он по-прежнему действителен для Joomla версии 3+
Pedro Bicudo Maschio
Ладно. Во всяком случае, вопрос уже был отмечен с Joomla-3.x .
Фараманд