mercoledì 25 novembre 2009

Lyra, gestione utenti backend

Arrivati a questo punto è necessario iniziare lo sviluppo delle funzione di gestione utenti. Chi ha scaricato l'applicazione dal repository avrà notato che non viene richiesto alcun login per accedere al backend, con la gestione gestione utenti saranno implementate le funzioni di controllo dell'accesso sia al backend che a quelle azioni del frontend che richiedono un'autenticazione (ad esempio inserimento e modifica articoli).

Seguirò le linee del tutorial ufficiale che prevede di utilizzare il plugin sfDoctrineGuardPlugin. Per prima cosa si installa il plugin con

./symfony plugin:install sfDoctrineGuardPlugin

Si attiva il plugin.

config/ProjectConfiguration.class.php

class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    $this->enablePlugins(array('sfDoctrinePlugin','sfDoctrineGuardPlugin'));
    $this->disablePlugins(array('sfPropelPlugin'));
  }
}

Questo almeno è come ho fatto io. Se nel metodo setup() della classe ProjectConfiguration si utilizza il metodo enableAllPluginsExcept() può non essere necessario abilitare singolarmente il plugin.

Si generano le classi del modello messe a disposizione dal plugin e si pulisce la cache di symfony come al solito quando si creano nuove classi.

./symfony doctrine:build-all-reload
./symfony cc

Poi si modifica la classe myUser e la si fa derivare dalla classe base che ci viene fornita dal plugin.

apps/backend/lib/myUser.class.php

class myUser extends sfGuardSecurityUser
{
}
Nella configurazione si abilitano i moduli di sfDoctrineGuardPlugin e si imposta l'azione che viene eseguita quando un utente richiede il login (signin).
apps/backend/config/settings.yml
...
all:
  .settings:
    enabled_modules: [default, sfGuardAuth, sfGuardUser, sfGuardGroup]
    ...
  .actions:
    login_module: sfGuardAuth
    login_action: signin
...

Adesso abbiamo quello che ci serve per attivare la funzione di login al backend.

apps/backend/config/security.yml

default:
  is_secure: on

Naturalmente a questo punto bisogna creare almeno un utente, lo si può fare da linea di comando con

./symfony guard:create-user admin admin

Fino a che restiamo in locale possiamo utilizzare admin come nome utente e password. Promuoviamo l'utente a superamministratore.

./symfony guard:promote admin

Il layout (layout.php in apps/backend/templates) del backend deve essere modificato per impedire la visualizzazione del menù principale agli utenti non autenticati ed aggiungervi un link per il logout e i link alla gestione utenti e gruppi utente che sono messe a disposizione dai moduli sfGuardUser e sfGuardGroup.

Questi moduli possono essere personalizzati con lo stesso metodo utilizzato per i moduli generati nell'applicazione impostando cioè i parametri di configurazione nel filegenerator.yml. Però non conviene modificare direttamente i file installati dal plugin in plugins/sfDoctrineGuardPlugin e sottocartelle, ma creare una cartella per ogni modulo in apps/backend/modules e inserirvi le personalizzazioni volute. In questo modo potremo fare gli aggiornamenti di sfDoctrineGuardPlugin senza sovrascrivere file che abbiamo modificato.

Ho creato una cartella apps/backend/modules/sfGuardUser/config e vi ho copiato il file generator.yml che si trova in plugins/sfDoctrineGuardPlugin/modules/sfGuardUser/config. Ho quindi modificato il file per personalizzare l'aspetto della lista utenti.

La stessa cosa è stata fatta per il modulo sfGuardGroup. Le personalizzazioni al momento sono minime, il contenuto dei file può essere consultato sul repository. In modo analogo è possibile personalizzare la classe actions e i template, esempi si trovano nella documentazione di sfDoctrineGuardPlugin.

Ho creato un file data/fixtures/users.yml per l'inserimento di un utente superamministratore nei dati di esempio. In questo modo durante lo sviluppo non si è costretti ad eseguire i comandi guard:create-user e guard:promote ogni volta che si ricreano le tabelle con doctrine:build-all-reload.

data/fixtures/users.yml

sfGuardUser:
  admin:
    username:       admin
    password:       admin
    is_super_admin: true

Ho inoltre definito le relazioni articolo-utente

config/doctrine/schema.yml

LyraArticle:
...
  relations:
    ...
    ArticleCreatedBy:
      class: sfGuardUser
      local: created_by
      foreign: id
      foreignAlias: CreatedArticles
    ArticleUpdatedBy:
      class: sfGuardUser
      local: updated_by
      foreign: id
      foreignAlias: UpdatedArticles

e relazioni analoghe nella tabella etichette

LyraLabel:
...
  relations:
      ...
      LabelCreatedBy:
        class: sfGuardUser
        local: created_by
        foreign: id
        foreignAlias: CreatedLabels
      LabelUpdatedBy:
        class: sfGuardUser
        local: updated_by
        foreign: id
        foreignAlias: UpdatedLabels

I file articles.yml e labels.yml in data/fixtures sono stati modificati in modo che quando si creano i dati di esempio le chiavi esterne dei record siano valorizzate opportunamente in base alle relazioni appena definite.

Tutto questo è incluso nella revisione 23. Visto che abbiamo modificato schema.yml e i file dei dati di esempio, dopo il checkout è necessario eseguire:

./symfony doctrine:build-all-reload
./symfony cc

A questo punto possiamo effettuare il login al backend.

http://lyra/backend_dev.php

Login e password: admin.

Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.