Kiểm tra xem người dùng có vai trò không


46

Làm cách nào để kiểm tra xem người dùng có vai trò nhất định không?

Tôi tìm thấy cái này nhưng nó dành cho Drupal 6.

Câu trả lời:


87

Vì bạn đã tìm thấy bài đăng đó , hãy chắc chắn rằng bạn cũng đã đọc các bình luận. Nó giải thích rõ ràng lý do tại sao việc kiểm tra cho phép được khuyến nghị hơn là kiểm tra vai trò. Khi bạn sử dụng quyền, bạn có thể gán quyền đó cho nhiều vai trò, điều này giúp hệ thống của bạn linh hoạt hơn. Ngoài ra, hãy nhớ rằng các vai trò có thể được đổi tên, sẽ phá vỡ mã của bạn.

Điều đó nói rằng, nếu bạn muốn kiểm tra vai trò, bạn có thể làm điều này:

// Load the currently logged in user.
global $user;

// Check if the user has the 'editor' role.
if (in_array('editor', $user->roles)) {
  // do fancy stuff
}

1
Nếu tôi muốn kiểm tra nhiều hơn 1 vai trò. ví dụ: Nếu "biên tập viên" hoặc "nhà xuất bản" hơn làm những thứ ưa thích. Cách viết mã. Làm ơn hãy khuyên nhủ. Không thể tìm ra thực sự.
Adamtan

8
Vui lòng đọc câu trả lời: không nên kiểm tra vai trò (hoặc nhiều hơn một). Kiểm tra quyền thay thế. Phần còn lại của câu hỏi của bạn (kết hợp hai điều kiện trong câu lệnh if) là PHP cơ bản, không có gì liên quan đến Drupal. Đọc tài liệu PHP về các toán tử logic .
marcvangend

11

Để kiểm tra xem người dùng hiện tại có một vai trò hay bất kỳ vai trò nào không, một cách tuyệt vời là làm:

//can be used in access callback too
function user_has_role($roles) {
    //checks if user has role/roles
    return !!count(array_intersect(is_array($roles)? $roles : array($roles), array_values($GLOBALS['user']->roles)));
};

if (user_has_role(array('moderator', 'administrator'))) {
  // $user is admin or moderator
} else if(user_has_role('tester')){
  // $user is tester
} else{
  // $user is not admin and not moderator
}

9

Cập nhật cho phiên bản Drupal> = 7.36

Bạn có thể sử dụng chức năng user_has_role từ API Drupal https://api.drupal.org/api/drupal/modules%21user%21user.module/feft/user_has_role/7 .

Hãy thử ví dụ này:

<?php
function MYMODULE_foo() {
  $role = user_role_load_by_name('Author');
  if (user_has_role($role->rid)) {
    // Code if user has 'Author' role...
  }
  else {
    // Code if user doesn't have 'Author' role...
  }

  $user = user_load(123);

  if(user_has_role($role->rid, $user)) {
    // Code if user has 'Author' role...
  }
  else {
    // Code if user doesn't have 'Author' role...
  }
}
?>

2

Bạn có thể cài đặt mô-đun phát và làm dpm ($ user). Điều này sẽ in một mảng với tất cả thông tin người dùng bao gồm cả vai trò người dùng.

Từ mảng này, bạn có thể tìm vị trí mảng của "vai trò" và sử dụng nó trong mô-đun của bạn để tìm vai trò người dùng.


Trong phần Phát triển-> Thực thi mã PHP, nhập: toàn cầu $ user; dpm ($ người dùng);
diamondsea

1

Để là Futureproof trong trường hợp tên vai trò thay đổi, tốt nhất là kiểm tra id vai trò (loại bỏ) có thể tìm thấy trong bảng vai trò trong cơ sở dữ liệu.

Nếu bạn muốn kiểm tra vai trò với 16, hãy làm:

// Load the currently logged in user.
global $user;

// Check if the user has the 'editor' role, when 'editor' has role id 16
if (array_key_exists(16, $user->roles)) {
  // do fancy stuff
}

1
Trên thực tế, khi bạn di chuyển những thứ như vai trò, tên máy có thể sẽ được giữ và ID sẽ không
Mołot

Không có tên máy chỉ là một loại bỏ và một tên người trong bảng vai trò. Bảng users_roles gán một uid để loại bỏ.
Hans Rossel

1

Đây là mã thực tế từ nhận xét được đề cập trong câu trả lời được chấp nhận là cách thực hành tốt nhất

<?php
  function mymodule_perm() {
    return array('access something special');
  }

  function dosomethingspecial() {
    // For current user
    if (user_access('access something special')) {
      // Doing something special!
    }

    // For a specific user
    if (user_access('access something special', $theuser)) {
      // Doing something special!
    }
  }
?>

0

Bạn có thể kiểm tra vai trò của người dùng bằng print_r ($ user) và trong đầu ra, bạn sẽ nhận được một cái gì đó như thế này

đối tượng stdClass
(
    [uid] => 0
    [tên máy chủ] => :: 1
    [vai trò] => Mảng
        (
            [1] => người dùng ẩn danh // Của tôi vai trò người dùng hiện tại là ẩn danh trong trường hợp của bạn, nó có thể khác
        )

0

để kiểm tra xem người dùng có vai trò nhất định không:

function test_role(){
   global $user;
   if(isset($user->roles['my_role'])){
     return true;
   }
   else {
    return false;
 }
}

0
global $user;
$roleid = 123; //
if(user_has_role($roleid, $user)) {
//yes this user has this role
}

0

Các câu trả lời ở trên không hoạt động, không chắc chắn, tôi thấy bài đăng này và mã phải là `

// Kiểm tra xem $ user có vai trò quản trị viên không. if (in_array ('quản trị viên', mảng_values ​​($ user-> vai trò))) {// Làm gì đó. }?> `

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.