Puncte:2

AccessDeniedHttpException pe o rută cu _access: TRUE

drapel iq

În modulul meu personalizat am câteva rute de „publicare” care nu necesită nici un fel de autentificare. Cu luni în urmă am aflat că aș putea realiza acest lucru cu următoarele cerințe în routing.yml:

my_module.myroute:
  [...]
  cerinte:
    _acces: „TRUE”

Acest lucru funcționează pe rutele mele existente.

Acum încerc să adaug unul nou care analizează Autorizare Antet HTTP numai în scop de identificare: scopul este de a afișa o vizualizare personalizată pe public date, fără a fi nevoie de autentificare sau autorizare. Deci, am încercat să ajung pe traseul meu personalizat adăugând un Autorizare antet (prin intermediul unei extensii de browser) și primesc următoarea eroare:

Calea: /CLS/it/pub/quadroxml. Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException: 
Metoda de autentificare utilizată nu este permisă pe această rută. 
în Drupal\Core\EventSubscriber\AuthenticationSubscriber->onExceptionAccessDenied() 
(linia 134 din [...]/core/lib/Drupal/Core/EventSubscriber/AuthenticationSubscriber.php).

Deci, trimiterea unui Autorizare header aparent declanșează o metodă de autentificare chiar și pe rutele cu _acces: „TRUE”.

Pot dezactiva complet toată autentificarea și autorizarea pe unele rute? Alternativ, pot să activez „metoda de autentificare folosită” pe traseul meu și apoi să accept orice parolă? (Sunt interesat doar de id-ul de utilizator!)

Puncte:1
drapel cn

Nu sunt sigur cum să accept orice parolă. Dar există o diferență între autentificarea implicită a utilizatorului și autentificare_de bază probabil că utilizați pentru această rută. Primul este definit ca fiind global:

core/module/user/user.services.yml

user.authentication.cookie:
    clasa: Drupal\user\Authentication\Provider\Cookie
    argumente: ['@session_configuration', '@database', '@messenger']
    Etichete:
      - { nume: authentication_provider, provider_id: „cookie”, prioritate: 0, global: TRUE }

în timp ce al doilea nu este:

core/module/basic_auth/basic_auth.services.yml

Servicii:
  basic_auth.authentication.basic_auth:
    clasa: Drupal\basic_auth\Authentication\Provider\BasicAuth
    argumente: ['@config.factory', '@user.auth', '@flood', '@entity_type.manager']
    Etichete:
      - { name: authentication_provider, provider_id: 'basic_auth', priority: 100 }

În acest caz, ruta trebuie să specifice _auth opțiune. Vedea

https://www.drupal.org/docs/drupal-apis/routing-system/structure-of-routes

Francesco Marchetti-Stasi avatar
drapel iq
Ei bine, acest lucru într-adevăr nu este complet, dar m-a pus pe drumul cel bun. Am înțeles că furnizorii de autentificare disponibili nu se potrivesc nevoilor mele, așa că am implementat unul personalizat. și apoi l-am adăugat la opțiunea `_auth`, așa cum am sugerat. Cred că acest lucru ar putea merita un nou răspuns și un comentariu la cealaltă întrebare care m-a pus pe drumul cel bun...
4uk4 avatar
drapel cn
Am ezitat să sugerez un furnizor de autentificare personalizat, deoarece subiectul întrebării era definirea rutei. Dar afișarea celor două definiții de bază a îndreptat în acea direcție și apoi, desigur, aveți nevoie de o prioritate > 100 pentru a le depăși pe ambele.
Francesco Marchetti-Stasi avatar
drapel iq
Da, într-adevăr a îndreptat în direcția corectă. Sunt curios în legătură cu declarația dvs. cu privire la prioritate, este posibil ca dacă folosesc o prioritate scăzută, furnizorii de autentificare predefiniti să fie încă utilizați? Întreb pentru că asta pare să se întâmple...
4uk4 avatar
drapel cn
Dacă ați activat Autentificarea de bază HTTP și trimiteți un antet de autorizare, acest modul este utilizat, cu excepția cazului în care implementați un furnizor de autentificare personalizat cu o prioritate mai mare. Autentificarea are loc înainte de rutare. După rutare, se verifică doar dacă furnizorul care a câștigat cursa de autentificare înainte este potrivit pentru traseu.
Francesco Marchetti-Stasi avatar
drapel iq
Văd. Asta explică tot ce am văzut.Nu am găsit acest comportament documentat nicăieri, dar poate că nu m-am uitat suficient de adânc. De asemenea, presupun că implementarea unui comportament personalizat pe o autentificare de bază HTTP nu este cu adevărat o cerință comună, mai ales în zilele noastre... Oricum, cred că _acum_ acest lucru este documentat, _aici_ :)
Puncte:0
drapel iq

Inspirat de răspunsul @4k4, am implementat un furnizor de autentificare personalizat, așa cum este detaliat Aici: implementarea eșantion utilizată pe pagina respectivă verifică doar prezența unui antet, a trebuit doar să îl înlocuiesc X-Auth-Token cu Autorizare pentru a obține codul pentru a face ceea ce am nevoie.

Cu o corectie minora, dar importanta: daca am plecat prioritate: 10 în etichetele serviciului de autentificare, I încă continua să primești aceeași eroare când trimit un Autorizare antetul cererii. M-am luptat cu această problemă câteva ore, căutând pe google; în cele din urmă ochii mi-au căzut pe prioritate: -10 valoarea unui serviciu de procesor de căi pe care l-am implementat cu luni în urmă, unde lăsasem comentariul util „Low priority acts last”, așa că am schimbat valoarea priorității la 1000 și dintr-o dată am reușit să-mi pun ruta la treabă!

Nu înțeleg exact de ce se întâmplă acest lucru, deoarece aveam doar furnizorul meu de autentificare personalizat în _auth vector sub Opțiuni, așa că nu văd cum un alt furnizor poate obține o prioritate mai mare. Cred că acesta poate fi o eroare, voi încerca să găsesc timp pentru a-l reproduce într-o instalare curată și a o înregistra.

Oricine are nevoie de ajutor în această problemă ar trebui să se uite și la această întrebare: nu m-a ajutat prea mult pentru ca nu este mentionata problema cu prioritate, dar din moment ce problema este exact aceeasi, poate se pot aduna si alte indicii.

Puncte:0
drapel bd

Puteți face aproape orice doriți atunci când vine vorba de controlul accesului, fie prin definirea unei verificări personalizate de acces printr-o clasă de controler (1) pe care o setați direct pe ruta specifică, fie prin crearea propriului serviciu de verificare a accesului (2).

1. Verificare acces prin clasa de controler
Documente: Verificare personalizată a accesului la rută

exemplu.rutare.yml

exemplu:
  [...]
  cerinte:
    _custom_access: „\Drupal\example\Controller\ExampleController::access”

ExempluController.php

clasa ExampleController {

  acces la funcția publică (AccountInterface $cont) {
    // Returnează aici \Drupal\Core\Access\AccessResultInterface
  }

}

2. Serviciu de verificare acces
Documente: Verificare avansată a accesului la rută

Practic, faci același lucru care oferă _acces parametrul pe care îl utilizați deja (care este implementat de DefaultAccessChecker. Așadar, creați un serviciu etichetat și setați acel serviciu să fie o cerință pe traseul dvs. Exemplul din documente este foarte complet, așa că nu îl copiez aici.

Francesco Marchetti-Stasi avatar
drapel iq
Mulțumesc, am adăugat deja o verificare personalizată a accesului la rută în modulul meu. Am încercat să adaug încă una pentru această nouă cale, dar nu a avut nicio diferență: în cele din urmă am reușit să-mi rezolv problema folosind un furnizor de autentificare personalizat, așa că bănuiesc că problema mea a fost în faza anterioară de autentificare și nu în verificarea accesului. fază.

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.