Como posso encontrar uma lista dos valores $ string disponíveis para a função user_access ($ string)?

27

user_access ($ string, $ account = NULL)

$ string: a permissão, como "administrar nós", está sendo verificada.

Como posso descobrir uma lista dos valores de string $ disponíveis para a user_access()função?

Gilzero
fonte

Respostas:

12

Desde que todos os módulos possam definir suas próprias permissões, não há uma lista "estrita" dessas strings. Você precisará "construí-lo" se realmente precisar dessa lista programaticamente.

Você pode executar este script em uma página / devel / php. (Obviamente, você precisa do módulo Devel .)

// Render role/permission overview:
$options = array();
foreach (module_list(FALSE, FALSE, TRUE) as $module) {
  print_r($module);
  // Drupal 6
  // if ($permissions = module_invoke($module, 'perm')) {
  //  print_r($permissions);
  // }

  // Drupal 7
  if ($permissions = module_invoke($module, 'permission')) {
    print_r($permissions);
  }
}
Haza
fonte
26

Como o @Berdir disse, a maneira mais fácil de ver quais permissões estão disponíveis é acessar as permissões admin / people / permissions no Drupal 7.

O problema com o qual eu continuava me deparando é que nunca consegui descobrir qual sequência eu precisava fornecer como um 'argumento de acesso' para realmente usar a permissão. Bem, aqui está como você encontra o nome da string para as permissões que deseja usar (este exemplo usa o Google Chrome.)

Passo um. Vá para admin / people / Permissions, encontre a permissão que você gostaria de usar e clique com o botão direito do mouse em uma caixa de seleção à direita da permissão que você gostaria de usar. Selecione 'Inspecionar elemento' ou apenas vá ver a fonte.

Exemplo

Em seguida, procure o valor da caixa de seleção e observe o valor. (Nesse caso, a sequência é 'criar conteúdo do cupom')

insira a descrição da imagem aqui

Essa é a string que você precisa fornecer como argumento de acesso em hook_menu ()

Código de exemplo: (itens não relevantes removidos, não se esqueça do título, retorno de chamada etc. em hook_menu ())

function fsrsys_menu() {
    $items = array();
    $items['my-custom-url'] = array(
        'access callback' => 'user_access',
        'access arguments' => array('create coupon content'),
    );
    return $items;
}
Citricguy
fonte
9

Aqui está uma versão D7 da resposta do Haza, modificada para usar o DSM em vez de print_r e deixar de fora os módulos que não implementam hook_permission:

// Render permission overview:
$options = array();
foreach (module_list(FALSE, FALSE, TRUE) as $module) {
  if ($permissions = module_invoke($module, 'permission')) {
    // List only the modules that have permissions.
    dsm($module);
    dsm($permissions);
  }
}
fureigh
fonte
6

Você pode usar a user_permission_get_modules()função, que retorna uma matriz de todas as permissões definidas e seus módulos.

Determine os módulos aos quais as permissões pertencem.

Valor de retorno

Uma matriz associativa no formato $ permission => $ module.

Елин Й.
fonte
2
Se você o envolver, array_keys()obviamente obterá apenas as informações solicitadas. Em seguida, você também pode usar o resultado em user_role_grant_permissions, por exemplo, para conceder todas as permissões à função de administrador:user_role_grant_permissions(variable_get("user_admin_role"), array_keys(user_permission_get_modules()));
aross
4

A maneira mais fácil é verificar a página de permissão (D7: admin / pessoas / permissões, D6: admin / usuário / permissões). Observe que você usa diretamente a seqüência de caracteres exibida no Drupal 6; para 7, você precisa dar uma olhada no nome / valor da caixa de seleção. Isso ocorre porque as permissões agora têm um título e uma descrição traduzidos no Drupal 7.

Portanto, se você deseja o nome da permissão "Visualizar conteúdo publicado" no Drupal 7, o valor é "acessar conteúdo", que é o seu nome de permissão.

Se você souber de qual módulo a permissão é proveniente, também poderá verificar a implementação hook_perm () (D6) / hook_pemission () (D7) correspondente desse módulo.

Em muitos casos, você deseja definir suas próprias permissões e usá-las. Você pode fazer isso com os ganchos acima.

Berdir
fonte
RE: "A maneira mais fácil é verificar a página de permissão (D7: admin / pessoas / permissões,).". A página mostra uma lista de permissões, mas elas são uma sequência legível por humanos, em vez de uma sequência legível por máquina.
gilzero
11
Como escrevi abaixo, o nome legível pela máquina pode ser extraído do valor de qualquer uma das caixas de seleção para uma determinada permissão.
Berdir
Esta resposta cobre Drupal 6 e 7, a única aceitos somente Drupal 6 - mas a resposta aceita é um truque e pode ser facilmente alterada para Drupal 7. =)
Greg
4

Usando o módulo Devel

  • Após instalar e ativar o módulo Devel , navegue para admin/config/development/devel. Há uma configuração intitulada "Exibir nomes de máquinas de permissões e módulos". Verifique se está marcado.

  • Agora, na página de permissões em people/permissions, passe o mouse sobre o nome da permissão que você está questionando. Pode demorar um ou dois segundos, mas o valor da string será exibido.

mlanning
fonte
Uau, eu não sabia disso. Vi depois que eu postei minha resposta. Obrigado!
Batandwa
Muito útil! TYVM.
DrCord
Doce, muito mais fácil do que abrir o código do módulo!
Blok_zero
1

Aqui está um simples formulário de alteração que adicionará a chave de permissão ao nome na página de permissões. Isso deve facilitar a procura. Você precisará adicioná-lo a um módulo personalizado e substituir "mymodule" pelo nome desse módulo.

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_user_admin_permissions_alter(&$form, $form_state) {
  foreach ($form['permission'] as $key => &$item) {
    if (isset($item['#type']) && $item['#type'] == 'item') {
      $item['#markup'] .= ' (' . $key . ')';
    }
  }
}
Randall Knutson
fonte
1

Eu criei esse snippet JavaScript que me ajuda com isso. Eu testei no Drupal 7 apenas no tema Shiny .

Basicamente, gera o nome da máquina, retirado da primeira caixa de seleção desse nome, para a primeira célula, sob o rótulo. O script depende do jQuery, que não deve ser um problema no Drupal 7.

Normalmente colo-o no console das Ferramentas do desenvolvedor e o executo a partir daí. Eu posso criar um bookmarklet para ele no futuro.

// Go through each of the rows on the permissin table
rows = jQuery('#permissions tr');
rows.each(function() {
    // Get the first checkbox in the row.
    checkbox = jQuery('.checkbox .form-checkbox', this).first();
    // Get the first cell, containing the permission label.
    nameCell = jQuery('td:first-child', this);
    // In case this is not a permission row
    if(checkbox.length == 0) {
        return;
    }

    // Embed the permission maching name on permission label cell.
    nameCell.append("<div><code>" + checkbox.val() + "</code></div>");
});
Batandwa
fonte
E, graças ao serviço Bookmarkify.it , você pode encontrar o bookmarklet aqui .
Batandwa
Esta é uma ferramenta realmente útil, ty!
DrCord 4/08/14
1
db_query("SELECT DISTINCT {permission} FROM role_permission");
emallove
fonte
0

basta inserir um módulo, você verá as permissões da máquina em / admin / people / Permissions

function YOURMODULE_form_user_admin_permissions_alter(&$form, &$form_state) 
{
    $perms = &$form['permission'];

    $group_counter = 0;
    foreach ($perms as $k => &$v) {
        if ($k == $group_counter) { // skip fieldsets
            $group_counter++;
            continue;
        }

        $v['#markup'] .= ' (<span class="description" style="color:brown">'.$k.'</span>)'; 
    }
}

Saudações

Yurii K.
fonte