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á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:
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'.
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 }
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.