欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

drupal 在开启devel的情况下 得到所有的权限列表 角色对应的所有权限 权限对应的所有角色 有大用 有大大用

shiping1 的头像

How can I find out a list of available $string values for user_access($string) function?


user_access($string, $account = NULL)

$string: The permission, such as "administer nodes", being checked for.

How can I find out a list of available $string values for user_access() function?

正确答案
 

As long as every module can define their own permissions, there is not a "strict" list of those string. You will need to "construct" it if you really need to have such a list programmatically.

You can run this script in a /devel/php page. (Of course, you need the Devel module.)

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


//下面是得到 权限 和角色的对应关系 有大用
//但是 如果一个权限 未分配给任何角色 好像得不到这个权限
//好像如果一个权限 未分配给任何角色 在数据库的表中就没有这个权限数据

function _setSameValue(&$value, $key, $sameValue)
{
$value = $sameValue;
}
function _getMonthTongjiInfo()
{
     if(user_access('administer')) {
          $result = db_query("SELECT p.perm,r.name FROM  {role} r   INNER JOIN {permission} p  ON p.rid = r.rid");
          $rolePerms = array();
          $permRoles = array();
          $tmppermRoles = array();
          while ($row = db_fetch_object($result)) {
          empty($rolePerms[$row->name]) && $rolePerms[$row->name]='';
          empty($rolePerms[$row->perm]) && $rolePerms[$row->perm]='';          
          $rolePerms[$row->name] = $rolePerms[$row->name].','.$row->perm;          
          $tmppermRoles = array_flip(explode(', ', $row->perm));
           //array_walk 就是能给数组每个元素进行处理吧 处理函数是_setSameValue
          array_walk($tmppermRoles, '_setSameValue', $row->name);
          //array_merge_recursive() 如果键值相同将把两个值合并在一起,形成一个新的数组,并以原有的键名作为数组名。
          $permRoles = array_merge_recursive($permRoles,$tmppermRoles);
      }
    //  $permRoles 里面的元素值 可能是数组 ,把元素弄成字符串
    foreach($permRoles as $key=>$value)
    {
    is_array($value) && $value = implode(', ',$value);
    $permRoles[$key] = $value;
    }
          $export = kprint_r($rolePerms, TRUE);
         print $export;
          $export = kprint_r($permRoles, TRUE);
         print $export;
          //$export = kprint_r($perms, TRUE);
         //print $export;
       
   }

}

//下面是得到所有启用到的权限
  if(user_access('administer')) {
          $result = db_query("SELECT p.perm,r.name FROM {role} r INNER JOIN {permission} p ON p.rid = r.rid");
          $perms = array();
          while ($row = db_fetch_object($result)) {
          $perms += array_flip(explode(', ', $row->perm));
      }
      dsm($perms);
       
   }


//根据权限得到拥有这个权限的角色

//这个是执行url 最初执行到的步骤  

function shipingzhongcustom_menu() {
$items = array();
$items['admin/getrolebypermission'] = array(
'title'=>'根据权限得到拥有这个权限的角色',
'type' => MENU_NORMAL_ITEM,
'page callback'=>'shipingzhongcustom_getrolebypermission_page',
//'page arguments' => array('hello','helloDrupal'),
'page arguments' => array(1,2),
// //它的优先级 大于 url传来的参数我
// //如果要默认值 就放在回调函数的形参上
// //array(1,2)表示只取url前两个参数 array(1)表示只取url第一个参数
'access arguments'=> array('administer')  
);
return $items;
}

//第一次参数是 getrolebypermission  第二个参数是 权限的名称 (我们这里只用到第二个参数)

function shipingzhongcustom_getrolebypermission_page($getrolebypermission='getrolebypermission',$permission='view field_xueyuan_qq')
{
//根据  like 初步筛选出角色
$result = db_query("SELECT p.perm as perm,r.name as name,p.rid as rid FROM {role} r INNER JOIN {permission} p ON p.rid = r.rid where p.perm like '%%%s%%'",$permission);
$rolesArr = array();
while ($obj = db_fetch_object($result)) {
// $tmpArr['rid'] = $obj->rid;
// $tmpArr['perm'] = $obj->perm;
// $tmpArr['name'] = $obj->name;
//   $permiArr[]=$tmpArr;
$rolesArr[$obj->rid]=$obj->name;
     }
     //主要的目的是检查一下某角色的所有的permission;;看某个角色的权限里 倒底有没有 传过来的$permission
     foreach($rolesArr as $key=>$value)
     {
      $perms = array();
      $resultPerms = db_query("SELECT p.perm FROM {role} r INNER JOIN {permission} p ON p.rid = r.rid 
      WHERE r.rid = '%d' ", $key);
      if ($row = db_fetch_object($resultPerms)) {
              $perms = explode(',', $row->perm);
        }
        foreach($perms as $keySon=>$valueSon){
        $perms[$keySon] = trim($valueSon);
        }        
        //如果传来的$permission不在某个角色的 $perms里 ,就剔除掉这个角色
        if(!in_array($permission,$perms)){
       
        unset($rolesArr[$key]);
        }
     }
 $rolesStrs =  implode(',',$rolesArr);
 
return $rolesStrs."<div style='color:#f00;font-size:14px;'>admin/getrolebypermission/的后面是权限的名称 比如(\"view field_xueyuan_qq\")  
<br />再比如(\"edit field_xueyuan_qq\")
</div>";
}

 

来自 http://drupal.stackexchange.com/questions/2764/how-can-i-find-out-a-list-of-available-string-values-...
来自   http://drupal.stackexchange.com/questions/2764/how-can-i-find-out-a-list-of-available-string-values-for-user-accessstring-f

普通分类: