Puncte:2

Retur AccesRefuzat pentru pagina personalizată

drapel mw

Am configurat o pagină personalizată în sistemul meu care se așteaptă la 2 parametri care vor fi utilizați pentru a genera o parte a conținutului de pe pagina respectivă, sunt capabil să recuperez informațiile de pe pagina mea, dar mă întreb care este cel mai bun metoda de returnare a unui acces refuzat atunci când criteriile mele nu eșuează

am găsit această pagină care arată cum puteți configura un controler de acces personalizat, dar acest exemplu transmite entitatea utilizator, când ceea ce mă interesează mai mult sunt „slug-urile” URL-ului pe care l-au accesat

rutare.yml

my_module.user_subscribe:
  cale: /my-module/subscribe/{entity_type}/{entity_id}
  implicite:
    _controller: \Drupal\my-module\Controller\SubscriptionPages::subscribe
    _title: Abonament prin e-mail reușit
    tip: nod
    entitate: 1
  cerinte:
    _permission: „accesează conținut”
    _entity_check: „TRUE”

Servicii.yml

Servicii:
  my_module.entity_check:
    clasa: Drupal\my-module\Access\EntityCheck
    Etichete:
      - { name: access_check, applies_to: _entity_check }

Apoi am a mea src/Controller/SubscriptionPages dosar și unul pentru src/Access/EntityCheck etc, toată acea parte pare să funcționeze, pot aplica manual codul din EntityCheck pentru a returna un acces refuzat, dar ceea ce vreau să știu este cum pot trage {tip de entitate} și {entity_id} de la adresa URL pe care au accesat-o, astfel încât să pot verifica că nu încearcă să acceseze ceva ce nu ar trebui

de exemplu

mywebsite.com/my-module/subscribe/node/15 - ar fi bine

mywebsite.com/my-module/subscribe/foo/bar - ar returna accesul refuzat, deoarece vreau să rulez verificarea în codul meu EntityCheck

În linkul de mai sus are argumente: ['@current_user'] în interiorul fișierului services.yml, există unul echivalent pentru URL-ul curent sau unul în care pot prelua în mod mai specific fiecare dintre elemente în mod individual?

Puncte:3
drapel de

În traseul tău, în loc de _permisiune, puteți utiliza un apel invers cu acces personalizat:

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

Apoi, puteți returna un AccessResult din apel invers de acces:

funcția publică accessCallback($entity_type, $entity_id) {
  dacă (!în_array($entity_type, $allowed_types)) {
    returnează \Drupal\Core\Access\AccessResult::interzis();
  }

  ...

  returnează \Drupal\Core\Access\AAccessResult::neutral();
}

Sau puteți folosi a _permisiune pe traseu, și în schimb aruncați a Symfony\Component\HttpKernel\Exception\NotFoundHttpException excepție de la controler dacă valorile sunt incorecte:

funcția publică someRouteCallback($entity_type, $entity_id) {
  dacă (!$entity = \Drupal::entityTypeManager()->getStorage($entity_type)->load($entity_id)) {
    arunca nou \Symfony\Component\HttpKernel\Exception\NotFoundHttpException();
  }
}
Andrew Morris avatar
drapel mw
Ah perfect, chiar mai bine, mulțumesc
4uk4 avatar
drapel cn
Rețineți că apelurile inverse de acces ar putea fi apelate din diferite motive și ar trebui să returneze rezultatul accesului, nu să acționeze în baza acestuia. Puteți arunca excepția în controler în sine, aceasta nu ar fi nicio problemă, dar nu este ideal. Aceasta este pentru a avea un apel invers de acces care returnează rezultatul accesului, apoi orice cod care verifică accesul rutei funcționează așa cum ar trebui.
Jaypan avatar
drapel de
Hopa. Mulțumesc, amestecam lucrurile. Am actualizat postarea în consecință. Andrew Morris, ar trebui să revizuiți actualizările mele și să vă schimbați codul în consecință.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.