Como detectar se o usuário é superusuário?

20

Para determinar se o visitante é um convidado , usamos algo como isto:

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

Agora, se eu quiser determinar se o visitante é um superusuário (administrador) registrado ou não, qual seria o código para isso?

Eu tenho alguns arquivos PHP externos que eu não quero que possam ser acessados ​​por ninguém, exceto pelos Superusuários do meu site Joomla. Apenas tentando proteger os arquivos importando o Joomla CMS.

saibbyweb
fonte
11
Engraçado que eu precisava disso ontem à noite e pesquisei até encontrar uma solução. No meu caso, eu estava substituindo a saída do RSFiles, para que a barra de ferramentas apareça apenas para administradores.
Brian Peat
11
Na verdade, $ user-> get ('isRoot'), que está na resposta aceita, não deve ser usado. Provavelmente, nas versões mais recentes do Joomla (3.6 e posterior), não funcionará quando chamado assim fora do JUser :: authorize (). Use $ user-> authorize ('seus parâmetros aqui'), como a resposta do dev-m.
FFrewin

Respostas:

28

esses códigos determinarão se o usuário conectado no momento é superusuário ou não -

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

esse código verificará o que está mapeado para a permissão "Superusuário" na configuração global e não apenas no nível do componente. Verifique você mesmo comparando com outras maneiras.

dev-m
fonte
2
A explicação nesta resposta é um pouco fraca, mas acho que core.adminé uma permissão melhor para verificar do que core.edit.
Brilliand
11
Discordo. core.admin é a permissão usada para controlar o acesso à configuração global; portanto, é a maneira apropriada de verificar se um usuário é o superadministrador. Se você verificar o grupo 8 como a resposta aceita, se o Joomla! Se você decidir randomizá-lo por motivos de segurança, seu script será interrompido. Sempre codifique com a mudança de mente. A menos que você nunca pretenda atualizar.
Mathew Lenning
Essa é claramente a melhor correspondência para uma verificação de superusuário. Ele verificará a segurança e a permissão do superusuário. github.com/joomla/joomla-cms/blob/staging/libraries/joomla/user/… A outra alternativa é $ user-> get ('isRoot'), que assume que a autorização já foi usada para preencher o estado isRoot. O isRoot pode ser usado diretamente, pois é uma propriedade protegida. github.com/joomla/joomla-cms/blob/staging/administrator/…
Peter Wiseman
Apenas para esclarecer qualquer dúvida sobre se esse código está correto ou não: esse código é usado no núcleo do Joomla (Joomla 3.5.1) para verificar se o usuário é um superadministrador ou não. Você pode encontrá-lo na linha 747 do libraries/joomla/user/user.phparquivo. É este:$iAmSuperAdmin = $my->authorise('core.admin');
itoctopus
8

Para determinar o status "Superusuário", você deve verificar $user->isRoot. Essa propriedade é configurada após a primeira verificação de autorização e o usuário é detectado como superadministrador.

No entanto, geralmente é melhor você verificar se o usuário tem determinadas permissões, como descrito nas outras respostas.

Bakual
fonte
3
Isso pressupõe que $ user-> authorize () já foi chamado por outra coisa para preencher a propriedade isRoot. Observe também que a propriedade isRoot está protegida e, portanto, precisa ter acesso via $ user-> get ('isRoot').
Peter Wiseman
6

Tente isso,

$user  = JFactory::getUser();

$user_groups = $user->groups;

print_r($user_groups);

Isso retornará uma matriz, Por padrão, os usuários Admin do Joomla Superadministrador (Grupos 8) e Administrador (Grupo 7).

Você pode verificar se a matriz possui algum desses valores e, em seguida, deve ser usuário administrador. Se você criou um grupo de usuários personalizados, também é necessário verificar #__usergroups parent Id.

Espero que ajude..

Jobin Jose
fonte
6

Você pode usar uma condição para recusar qualquer pessoa que não esteja em um grupo específico.

$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
fonte
11
Número mágico não é uma ótima solução. Você pode conceder permissões de superadministrador a qualquer grupo e / ou excluir o grupo padrão de superadministrador.
David Hayes
Eu usei algo como if(in_array(8, $user->groups))e funcionou para mim
Linga
4

Tente o código abaixo para verificar se o usuário de login é superadministrador ou outros usuários ...

$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
fonte
11
Na verdade, $ user-> get ('isRoot') não deve ser usado. Provavelmente, nas versões mais recentes do Joomla (3.6 e posterior), ele não funcionará quando chamado assim fora do JUser :: authorize (). Use $ user-> authorize ('seus parâmetros aqui'), como a resposta do dev-m.
FFrewin
Vou testá-lo primeiro, obrigado por apontar. :)
saibbyweb
11
$user->get('isRoot');não está funcionando para o J3.6.2.
saibbyweb
2

O Joomla @since 3.2, no campo UserGroupList, é utilizado para verificar:

$isSuperUser = JFactory::getUser()->authorise('core.admin');
Pedro Bicudo Maschio
fonte
Esta resposta é muito semelhante à resposta do @ dev-m .
Farahmand
@Farahmand você está certo, eu apenas acrescentado para confirmar o que é Joomla preferido método e que ainda é válido para a versão Joomla 3+
Pedro Bicudo Maschio
OK. De qualquer forma, a pergunta já foi marcada com o joomla-3.x .
Farahmand