如何找到用于user_access($ string)函数的可用$ string值的列表?


27

user_access($ string,$ account = NULL)

$ string:正在检查权限,例如“管理节点”。

如何找到可用的$ string user_access()函数值列表?

Answers:


12

只要每个模块都可以定义自己的权限,就没有这些字符串的“严格”列表。如果您确实需要以编程方式拥有这样的列表,则需要“构造”它。

您可以在/ devel / php页面中运行此脚本。(当然,您需要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);
  }
}

26

正如@Berdir所说,查看哪些权限可用的最简单方法是转到Drupal 7中的admin / people / permissions权限。

我一直遇到的问题是,我永远无法弄清楚需要提供什么字符串作为“访问参数”才能真正利用权限。好的,这是您找到要使用的权限的字符串名称的方法(此示例使用Google Chrome)。

步骤1。转到admin / people / permissions,找到您要使用的权限,然后右键单击您要使用的权限右侧的复选框。选择“检查元素”或只是查看源代码。

例

接下来寻找复选框的值并记下该值。(在这种情况下,字符串为“创建优惠券内容”)

在此处输入图片说明

这是您需要在hook_menu()中作为访问参数提供的字符串。

示例代码:(删除了不相关的项,不要忘了hook_menu()中的标题,回调等)

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

9

这是Haza答案的D7版本,已修改为使用DSM代替print_r,并省略了未实现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);
  }
}

6

您可以使用user_permission_get_modules()函数,该函数返回所有已定义权限及其模块的数组。

确定权限所属的模块。

返回值

$ permission => $ module格式的关联数组。


2
如果将其包装,array_keys()显然只能得到所需的信息。然后,您还可以使用中的结果user_role_grant_permissions,例如,授予管理员角色所有权限:user_role_grant_permissions(variable_get("user_admin_role"), array_keys(user_permission_get_modules()));
aross 2015年

4

最简单的方法是检查权限页面(D7:admin / people / permissions,D6:admin / user / permissions)。请注意,您直接在Drupal 6中使用显示的字符串,对于7,您需要查看复选框名称/值。这是因为权限现在在Drupal 7中具有翻译的标题和描述。

因此,如果要在Drupal 7中使用权限“查看发布的内容”的名称,则值为“访问内容”,这是您的权限名称。

如果知道许可权来自哪个模块,则还可以检查该模块的相应hook_perm()(D6)/ hook_pemission()(D7)实现。

在许多情况下,您想定义自己的权限并使用这些权限,可以使用上述挂钩进行操作。


RE:“最简单的方法是检查权限页面(D7:admin / people / permissions,)。”。该页面显示了权限列表,但是它们是人类可读的字符串,而不是机器可读的字符串。
gilzero

1
如下所述,对于给定的权限,可以从任何复选框的值中提取机器可读的名称。
2011年

此答案涵盖Drupal 6和7,仅接受一个Drupal 6-但接受的答案是一种巧妙的技巧,对于Drupal 7来说很容易更改。=)
Greg

4

使用开发模块

  • 安装并启用Devel模块后,导航至admin/config/development/devel。有一个标题为“显示权限和模块的计算机名称”的设置。确保已检查。

  • 现在,在的权限页面上people/permissions,将鼠标悬停在您要查询的权限名称上。可能会延迟一两秒钟,但随后会显示字符串值。


哇,我对此一无所知。我发布答案后就看到了。谢谢!
Batandwa 2014年

很有用!TYVM。
DrCord 2014年

亲爱的,比打开模块代码容易得多!
bloke_zero 2016年

1

这是一个简单的表单更改,它将在权限页面上的名称中添加权限密钥。那应该使查找起来更容易。您将需要将其添加到自定义模块,并将“ mymodule”替换为该模块的名称。

/**
 * 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 . ')';
    }
  }
}

1

我创建了这个JavaScript代码段,可以帮助我解决这一问题。我在Drupal 7中仅针对Shiny主题进行了测试

它基本上将机器名称从该名称的第一个复选框输出到标签下的第一个单元。该脚本依赖jQuery,在Drupal 7上应该不会有问题。

我通常将其粘贴在Developer Tools控制台上并从那里运行。我将来可能会为其创建一个书签。

// 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>");
});


这是一个非常有用的工具!
DrCord 2014年

1
db_query("SELECT DISTINCT {permission} FROM role_permission");


0

只需添加一些模块,您将在/ 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>)'; 
    }
}

问候

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.