Redirect e Controllo Accesso con modulo
Ho la pagina home, che può essere visibile solo agli Utenti autenticati, se non autenticato lo reindirizzo nella pagina di login e dopo l'autenticazione reindirizzarlo alla pagina home.
Il tutto gestito tramite hook_form_alter. Non so se sia giusto o meno.
Ho provato funziona ma non effettua l'accesso.
Probabilmente dipenderà dalla sovrascrittura del bottone submit che richiama una func per il reindirzzamento. Mi sa che non è questo il punto dove farglielo fare ma effettuare il controllo dopo l'autenticazione.
Ho letto vari articoli ma ancora non ho capitlio dove sta la soluzione
Gaetano
Risposte
Forse potresti provare il
Forse potresti provare il modulo https://www.drupal.org/project/front.
Probabilmente risolvi senza una linea di codice.
Spero ti sia utile.
m'interessa studiare come
m'interessa studiare come funziona Drupal attraverso le personalizzazioni.
Ho capito come impostare un modulo e usare hook_form_alter però adesso vorrei proseguire nell'apprendimento e mi ero posto un problema da risolvere.
Un esempio, quando viene richiamato un nodo vorrei fare il controllo se quelo nodo è possibile visionarlo da parte di tutti o solo da parte di alcuni utenti che hanno un ruolo
quando viene richiamato un
puoi provare con hook_node_access
https://api.drupal.org/api/drupal/core%21modules%21node%21node.api.php/f...
Ho letto il codice
Ho letto il codice dell'esempio hook_node_access. Effettua il controllo sull'edit (per nodi propri creati o per tutti i nodi) e la cancellazione. Il codice va a leggere i permessi dell'utente e restituisce l'autorizzazione.
Nella gestione dei permessi ho visto che non è prevista la visualizzazione.
Codice:
...
$type = $node
->bundle();
switch ($op) {
case 'create':
return AccessResult::allowedIfHasPermission($account, 'create ' . $type . ' content');
case 'update':
if ($account
->hasPermission('edit any ' . $type . ' content')) {
return AccessResult::allowed()
->cachePerPermissions();
}
else {
return AccessResult::allowedIf($account
->hasPermission('edit own ' . $type . ' content') && $account
->id() == $node
->getOwnerId())
->cachePerPermissions()
->cachePerUser()
->addCacheableDependency($node);
}
...
In fondo al codice ci sono queste righe
default:
// No opinion.
return AccessResult::neutral();
dovrebbe significare che per le situazioni dove non c'è il controllo su create - edit e delete ritorna un accesso neutrale.
Leggendo le varie classi oltre a AccessResult::neutral c'è anche la classe AccessResult::forbidden
che pensavo di usare in fase di view per bloccare la visualizzazione.
AccessResult::forbidden();
Però mi ritorna un errore.
E' vero che sto cercando di capire come funzionano le classi ed i metodi, però per logica in tutti i casi non previsti dal controllo il ritorno dovrebbe essere bloccato
Tutte queste proprietà
>id() == $node
->getOwnerId())
->cachePerPermissions()
->cachePerUser()
->addCacheableDependency($node);
dove le posso andare a leggere?
Scusa per la prolissità
potrebbe esserti utile
potrebbe esserti utile qualcosa del genere:
<?php
function NOMEMODULO_node_access(\Drupal\node\NodeInterface $node, $op, \Drupal\Core\Session\AccountInterface $account) {
if ($op == 'view') {
$hasRole = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id())->hasRole('NOMERUOLO');
return \Drupal\Core\Access\AccessResult::forbiddenIf(!$hasRole)
->cachePerPermissions()
->cachePerUser()
->addCacheableDependency($node);
}
}
?>
$hasRole =
Se ho capito il codice carica l'array dell'utente e, nel ritorno, se ha come nome ruolo un nome diverso da quello che indico io in "esempio ...->hasRole('contopri')" mi impedisce la visualizzaizone del nodo.
Grande, funziona, complimenti, mi puoi instradare su cosa devo leggere per poter capire i meccanismi per scrivere righe del genere (con D9 quando sarà tutto OOP il codice cambierà?)
Ti chiedo ciò in quanto ho notato alcune cose:
1) ->hasRole non è un array, quindi se ci sono + ruoli devo fare un controllo diverso. Oppure spostarmi su utente autneticato, anche se risulta non esaustivo;
2) Ho notato che in fase di visualizzazione se nell'url scrivo node/100 ed il nodo non è di proprietà dell'utente autenticato, ne permette ugualmente la visualizzazione. Invece per alcuni nodi é importante che così come accade per la modifica o eliminazione, l'utente abbia accesso solo ai suoi contenuti
grazie per l'aiuto e l'istruzione che mi stai permeteendo di avere
Scusa non so come ma
Scusa non so come ma haraddoppiato il commento e l'ho cancellato
Se guardi
Se guardi
https://api.drupal.org/api/drupal/core%21modules%21node%21node.api.php/f...
ogni elemento anche nel codice è cliccabile e ti porta sulla pagina relativa all'istruzione.
Questo è utilissimo ma devi avere un'idea complessiva di come funziona Drupal e in generale il paradigma ad oggetti di Php e nozioni di Symfony.
Parti dalla documentazione ufficiale, dalla base o magari acquista qualche testo utile (ad esempio: https://www.amazon.it/s?k=%22Drupal+8+Module+Development%22).
Molti dei materiali utili sono in inglese ma credo sia fondamentale una base di questa lingua se vuoi approfondire questa piattaforma.
Uhm mi deve applicare tanto
Uhm mi deve applicare tanto allora. il Mio inglese non è dei migliori. Inizio comprando il libro e metterò più attenzione nella scrittura del codice
grazie
Libro comprato speriamo
Libro comprato speriamo riesca a comprendere (in inglese) quello che sta scritto
Ho iniziato a fare quello che mi hai suggerito e ho cercato la pagina relativa all'utente
per caricare l'entità utente completa
Così ottengo il nome dell'utente
Ho girato tra le varie pagine ma non ho trovato la pagina in cui sono riepilogate tutte le proprietà (non so se si chiamino così) oltre al nome ed altro oppure i ruoli
Sempre a proposito del codice con ->id() si carica i dati completi dell'utente, mentre con questo codice
carica l'array dei ruoli dell'utente.
Per capire com'è strutturato il codice, continuando ad usare il codice precedente
$Nome = $user->get('name')->value;
al posto del name cosa va scritto? Ho provato con roles ma non mi restituisce nulla, anche se lo considero un array
La migliore cosa per poter
La migliore cosa per poter lavorare è avere un IDE con autocompletamento per poter vedere live i metodi di un oggetto e una libreria per l'output di debug. Kint (devel kint) ti permette di vedere tutto all'interno degli oggetti: metodi, variabili, costanti, iteratori etc ..
Può essere davvero utile anche fare debug a runtime, ad esempio con xdebug installato e collegato all'IDE che utilizzi (cerca xdebug su Google per installazione e utilizzo).