Ngăn người dùng chỉnh sửa hoặc xem hồ sơ của chính họ


7

Cách tốt nhất để vô hiệu hóa quyền truy cập vào hồ sơ người dùng để xem và chỉnh sửa là gì? Về cơ bản người dùng có thể tạo tài khoản nhưng sẽ không thể chỉnh sửa hoặc xem hồ sơ của chính họ hoặc của người dùng khác.

Câu trả lời:


11

Thêm phần này vào một mô-đun tùy chỉnh:

function MYMODULE_menu_alter(&$items) {
  $items['user/%user']['access arguments'] = array('access user profiles');
  $items['user/%user']['access callback'] = 'user_access';
  $items['user/%user/edit']['access arguments'] = array('administer users');
  $items['user/%user/edit']['access callback'] = 'user_access';
}

Điều này sẽ đặt chế độ xem hồ sơ người dùng dưới quyền 'Xem hồ sơ người dùng' và chỉnh sửa trong phần 'Quản trị người dùng'.


cảm ơn rất nhiều! làm việc một điều trị. Tôi nghĩ rằng tôi đã cố gắng làm điều này với hook_menu nhưng tôi cho rằng nó đã ở sai vị trí và nên ở trong hook_menu_alter
space_balls

Đơn giản là tuyệt vời. Tôi đã tìm kiếm một mô-đun đóng góp cho việc này. Nhưng, câu trả lời này đã thực hiện công việc trong ít dòng mã nhất.
Học sinh

7

Vì câu hỏi dường như không cụ thể đối với Drupal 7, nên đây là cách bạn thực hiện trong Drupal 8. hook_menu_alter không còn nữa, bây giờ bạn sử dụng Trình đăng ký Tuyến đường. Bạn có thể thấy cách làm việc này ở đây: https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-ones

RouteSubscacker sẽ trông như thế này:

<?php

namespace Drupal\my_module\Services;

use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;

/**
 * Listens to the dynamic route events.
 */
class RouteSubscriber extends RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  protected function alterRoutes(RouteCollection $collection) {

    // Edit user
    if ($route = $collection->get('entity.user.edit_form')) {
      $route->setRequirement('_permission', 'administer users');
    }

    // View user
    if ($route = $collection->get('entity.user.canonical')) {
      $route->setRequirement('_permission', 'administer users');
    }
  }
}

Tên tuyến được lấy từ mô đun người dùng cốt lõi. Trong "setRequonth", bạn có thể làm mọi thứ bạn có thể làm trong cấu hình tuyến thông thường. Lưu ý rằng setRequonth bổ sung quyền (hoặc vai trò, v.v.), nhưng yêu cầu ["_entity_access"] => "user.update" vẫn là một phần của tuyến đường.

Sau đó, bạn cần đăng ký dịch vụ trong tệp yaml của mô-đun:

services:
  my_module.route_subscriber:
    class: Drupal\my_module\Services\RouteSubscriber
    tags:
      - { name: event_subscriber }

0

Thay vì tạo một mô-đun cho điều đó, bạn có thể chỉ cần tạo một quy tắc.

Đây là cách thực hiện:

Bước 1: tạo quy tắc hoạt động cho sự kiện này: "Trang tài khoản người dùng được xem"

Bước 2: đặt một điều kiện, đại loại như: "KHÔNG Người dùng có vai trò Tham số: Người dùng: [tài khoản], Vai trò: quản trị viên"

Bước 3: tạo hành động: "Chuyển hướng trang Thông số: URL: toboggan / bị từ chối" (trong trường hợp bạn đang sử dụng toboggan đăng nhập nhưng bất kỳ url trang nào cũng hoạt động ở đây để bạn có thể tạo một trang đặc biệt cho câu nói như: "Chúng tôi rất xin lỗi nhưng tại thời điểm này bạn không thể truy cập trang hồ sơ của mình. "

Bước 4: làm cho quy tắc này hoạt động, ví dụ trong trường hợp bạn muốn có phiên bản mới nhất của trang web sản xuất của mình, tải xuống bản sao lưu sql, tìm hiểu về nó cục bộ và sau đó chắc chắn tải lên lại mà không làm thất vọng bất kỳ người dùng nào muốn cập nhật hồ sơ của họ trong thời gian trung bình.

Ngoài ra, bạn cũng có thể thêm một điều kiện khác để kiểm tra xem người dùng đang xem trang hồ sơ của người dùng khác hay của riêng họ để bạn thực hiện hai quy tắc khác nhau, một quy tắc hiển thị một trang nói rằng họ tạm thời không thể cập nhật hồ sơ của họ và một quy tắc khác hiển thị trang nêu rõ lý do tại sao họ không thể xem hồ sơ người dùng cụ thể.

Tôi đã kiểm tra điều này và thêm điều kiện này: "Tham số so sánh dữ liệu: Dữ liệu để so sánh: [tài khoản], Giá trị dữ liệu: [trang web: người dùng hiện tại]" Điều này không chỉ từ chối truy cập để xem tài khoản của họ và sau đó hiển thị trang chính xác bạn đã tạo cho truy cập bị từ chối này. Tôi nghĩ rằng điều này có ý nghĩa hơn.


Luôn hào hứng sử dụng sức mạnh của các quy tắc. Tuy nhiên, điều này không hoạt động nếu người dùng có URL trực tiếp đến trang chỉnh sửa / người dùng / nn / chỉnh sửa. Nó không ngăn họ đi đến / trang người dùng.
Tony

Cũng phát hiện ra. Nếu chúng ta chỉ có thể thêm một điều kiện nữa để kiểm tra xem một url có thuộc chuỗi người dùng / * thì chúng ta sẽ được lưu. Tôi đã thử với một so sánh văn bản so sánh [tài khoản: chỉnh sửa url] và [trang web: người dùng hiện tại: chỉnh sửa url] nhưng điều đó không hiệu quả. Điều kiện "Đường dẫn có bí danh url" cũng không phải là điều kiện [site: current-user: edit-url]. Tôi sẽ tiếp tục tìm kiếm.
BassPlaya

Tôi không thể tìm ra nó và mã từ câu trả lời được chấp nhận hoạt động tốt vì vậy tôi đã từ bỏ.
Tony
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.