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.