Điểm:2

Trả lại AccessDenied cho trang tùy chỉnh

lá cờ mw

Tôi đã thiết lập một trang tùy chỉnh trong hệ thống của mình, trang này đang mong đợi 2 tham số sẽ được sử dụng để tạo một phần nội dung trên trang đó, tôi có thể truy xuất thông tin từ trang của mình, nhưng tôi không biết đâu là trang tốt nhất phương pháp trả lại quyền truy cập bị từ chối khi tiêu chí của tôi không thành công

tôi đã tìm thấy trang này cho biết cách bạn có thể thiết lập bộ điều khiển truy cập tùy chỉnh, nhưng ví dụ này đang chuyển thực thể người dùng, trong khi điều tôi quan tâm hơn là 'sên' của URL mà họ đã truy cập

định tuyến.yml

my_module.user_subscribe:
  đường dẫn: /my-module/subscribe/{entity_type}/{entity_id}
  mặc định:
    _controller: \Drupal\my-module\Controller\SubscriptionPages::subscribe
    _title: Đăng ký email thành công
    loại: nút
    thực thể: 1
  yêu cầu:
    _permission: 'truy cập nội dung'
    _entity_check: 'TRUE'

Dịch vụ.yml

dịch vụ:
  my_module.entity_check:
    lớp: Drupal\my-module\Access\EntityCheck
    thẻ:
      - { name: access_check, apply_to: _entity_check }

Sau đó, tôi có của tôi src/Trình điều khiển/Trang đăng ký tập tin, và một cho src/Truy cập/Kiểm tra thực thể v.v., tất cả phần đó dường như đang hoạt động, tôi có thể thực thi mã theo cách thủ công trong EntityCheck của mình để trả lại quyền truy cập bị từ chối và đúng như vậy, nhưng điều tôi muốn biết là làm cách nào để kéo {entity_type}{ID phap nhân} từ URL họ đã truy cập để tôi có thể kiểm tra xem họ có đang cố truy cập vào thứ mà họ không nên truy cập không

ví dụ

mywebsite.com/my-module/subscribe/node/15 - sẽ ổn thôi

mywebsite.com/my-module/subscribe/foo/bar - sẽ trả lại quyền truy cập bị từ chối, vì tôi muốn chạy kiểm tra bên trong mã EntityCheck của mình

Bên trong liên kết ở trên nó có đối số: ['@current_user'] bên trong tệp services.yml, có một URL tương đương cho URL hiện tại hay những URL mà tôi có thể truy xuất từng mục một cách cụ thể hơn không?

Điểm:3
lá cờ de

Trong tuyến đường của bạn, thay vì _sự cho phép, bạn có thể sử dụng gọi lại quyền truy cập tùy chỉnh:

_custom_access: Drupal\[MODULE]\Controller::accessCallback()

Sau đó, bạn có thể trả về AccessResult từ lệnh gọi lại truy cập:

chức năng công khai accessCallback($entity_type, $entity_id) {
  if (!in_array($entity_type, $allowed_types)) {
    trả về \Drupal\Core\Access\AccessResult::forbidden();
  }

  ...

  trả về \Drupal\Core\Access\AAccessResult::neutral();
}

Hoặc, bạn có thể sử dụng một _sự cho phép trên tuyến đường, và thay vào đó ném một Symfony\Component\HttpKernel\Exception\NotFoundHttpException ngoại lệ từ bộ điều khiển nếu các giá trị không chính xác:

hàm công khai someRouteCallback($entity_type, $entity_id) {
  if (!$entity = \Drupal::entityTypeManager()->getStorage($entity_type)->load($entity_id)) {
    ném \Symfony\Component\HttpKernel\Exception\NotFoundHttpException() mới;
  }
}
Andrew Morris avatar
lá cờ mw
Ah hoàn hảo, thậm chí còn tốt hơn, cảm ơn bạn
4uk4 avatar
lá cờ cn
Xin lưu ý rằng các cuộc gọi lại truy cập có thể được gọi vì các lý do khác nhau và chúng phải trả về kết quả truy cập chứ không phải hành động trên kết quả đó. Bạn có thể ném ngoại lệ vào chính bộ điều khiển, điều này sẽ không có vấn đề gì, nhưng nó không lý tưởng. Điều này là để có một cuộc gọi lại truy cập trả về kết quả truy cập, sau đó bất kỳ mã nào kiểm tra truy cập tuyến đường sẽ hoạt động như bình thường.
Jaypan avatar
lá cờ de
Rất tiếc. Cảm ơn, tôi đã trộn mọi thứ. Tôi đã cập nhật bài viết cho phù hợp. Andrew Morris, bạn nên xem lại các cập nhật của tôi và thay đổi mã của mình cho phù hợp.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.