Respostas:
Se você deseja verificar se o usuário conectado no momento tem acesso a uma página, use o seguinte código:
if ($router_item = menu_get_item($path)) {
if ($router_item['access']) {
// The user has access to the page in $path.
}
}
$path
é o caminho da página que você deseja verificar (por exemplo, nó / 1, admin / usuário / usuário).
O código funciona no Drupal 6 e versões superiores, e é o código usado em menu_execute_active_handler () .
O motivo pelo qual não estou sugerindo chamar diretamente o retorno de chamada de acesso é porque os argumentos que precisam ser passados para essa função.
O código usado por _menu_check_access () é o seguinte (Drupal 7):
$arguments = menu_unserialize($item['access_arguments'], $map);
// As call_user_func_array is quite slow and user_access is a very common
// callback, it is worth making a special case for it.
if ($callback == 'user_access') {
$item['access'] = (count($arguments) == 1) ? user_access($arguments[0]) : user_access($arguments[0], $arguments[1]);
}
elseif (function_exists($callback)) {
$item['access'] = call_user_func_array($callback, $arguments);
}
O código, que precisa ser o mais genérico possível, não lida diretamente com um objeto de usuário. Isso significa que não é possível substituir o objeto de usuário do usuário atualmente conectado por outro objeto de usuário.
O código deve ser genérico o suficiente para manipular definições de menu, como as seguintes:
$items['node/add/' . $type_url_str] = array(
'title' => $type->name,
'title callback' => 'check_plain',
'page callback' => 'node_add',
'page arguments' => array($type->type),
'access callback' => 'node_access',
'access arguments' => array('create', $type->type),
'description' => $type->description,
'file' => 'node.pages.inc',
);
$items['node/%node'] = array(
'title callback' => 'node_page_title',
'title arguments' => array(1),
// The page callback also invokes drupal_set_title() in case
// the menu router's title is overridden by a menu link.
'page callback' => 'node_page_view',
'page arguments' => array(1),
'access callback' => 'node_access',
'access arguments' => array('view', 1),
);
Nas duas definições, os argumentos de acesso não incluem um objeto de usuário e, neste caso , node_access () usa o objeto de usuário para o usuário conectado no momento. No segundo caso, um dos argumentos é o objeto de nó obtido da URL; por exemplo, se a URL for example.com/node/1, o segundo argumento passado para o retorno de chamada de acesso é o objeto do nó com o ID do nó igual a 1.
Escrever código que também lida com esses casos significaria duplicar o código já existe no Drupal. Mesmo se você duplicou esse código, ainda haveria o problema dos retornos de chamada de acesso que estão verificando o acesso no usuário conectado no momento.
Se você deseja verificar se um usuário que não é o usuário conectado no momento pode acessar um menu, altere primeiro o valor da variável global $user
, use o código que relatei no início da minha resposta e, em seguida, restaure o valor de $user
. Para saber como alterar o valor global $user
, você pode ver Representando programaticamente outro usuário sem fazer com que o usuário conectado no momento efetue logout . A diferença é que, em vez de usar o valor retornado de drupal_anonymous_user () , você usa o valor retornado de user_load () .
Tente drupal_valid_path () .
A função retorna TRUE
é o caminho passado conforme o argumento existe e o usuário atual tem acesso a ele. Portanto, se você estiver trabalhando no Drupal 7 e precisar verificar o acesso do usuário atualmente conectado, é o caminho mais fácil:
if (drupal_valid_path('my/path')) {
// Your code here...
}
drupal_valid_path
faz o trabalho perfeitamente e é feito para atender exatamente a essa necessidade. Ele usa menu_get_item e verifica o acesso também.
drupal_valid_path
não o ajudará.
\Drupal::service('path.validator')->isValid($path);
- veja a documentação
Ligue para o access callback
especificado na entrada do menu responsável pela página. Essa entrada de menu geralmente é criada pelo Drupal chamando a implementação hook_menu
e é armazenada em algum lugar do banco de dados. Cuidado para que os dados retornados por hook_menu
possam ser alterados por uma implementação de módulo hook_menu_alter
.
Observe que alguns módulos podem não passar o usuário como um argumento separado (conforme especificado pela access arguments
chave da entrada do menu), mas, em vez disso, podem usar o $user
objeto global . Você precisará verificar isso para cada módulo que você usa.
Confira a user_access()
função. Consulte o link para os parâmetros especificados para cada versão do Drupal. Na página de documentação do Drupal 7-8:
Parâmetros
$ string A permissão, como "administrar nós", está sendo verificada.
$ account (opcional) A conta a ser verificada, se não for dada, use o usuário conectado no momento.
Valor de retorno
Booleano TRUE se o usuário atual tiver a permissão solicitada.
Todas as verificações de permissão no Drupal devem passar por essa função. Dessa forma, garantimos um comportamento consistente e garantimos que o superusuário possa executar todas as ações.
user_access()
nem sempre é o retorno de chamada de acesso usado por um menu; mesmo assim, você deve conhecer os argumentos de acesso aos quais precisa passar user_access()
.
user_access()
, apenas imaginei que o OP tinha uma permissão em mente para verificar se o usuário deveria ter acesso. Não era uma pergunta muito descritivo
Se você precisar saber se um usuário pode acessar um nó específico e está usando um módulo de acesso ao nó, use node_access () . (sem um módulo de acesso ao nó, eles apenas precisam da permissão "acessar conteúdo".)
Se você deseja descobrir se um usuário pode acessar um caminho arbitrário definido por uma implementação hook_menu (), pode ser necessário recuperar a entrada de menu do banco de dados e avaliar seu parâmetro 'access callback'.
$node = node_load(123);
$account = user_load(456);
if (node_access("update", $node, $account) === TRUE)
{
print "access";
}