Basic authentication

Può capitare di avere un progetto in symfony che non prevede utenti, ma che ha comunque un’interfaccia di amministrazione. In questo caso, vale la pena installare sfGuardPlugin solo per far accedere un singolo utente? Ovviamente no.
Vediamo allora come risolvere il problema in modo semplice ed elegante.
Supponiamo di trovarci in una configurazione standard, con l’opzione security attivata per l’applicazione backend, e di avere a disposizione un modulo chiamato “default”. Se si preferisce un modulo diverso, occorre configurare opportunamente il file settings.yml per farvi puntare il login. Il primo passo consiste nell’aggiungere una rotta in routing.yml:

1
2
3
login:
  url:   /login
  param: { module: default, action: login }

Inseriamo poi le credenziali dell’utente che deve accedere al backend, nel file app.yml dell’applicazione:

1
2
3
4
all:
  admin_user:     admin
  # qui conviene mettere una password migliore :-)
  admin_password: admin

Basterà quindi inserire la sequente azione nel modulo default:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public function executeLogin(sfWebRequest $request)
{
  if ($this->getUser()->isAuthenticated())
  {
    return $this->redirect('@homepage');
  }
  if (isset($_SERVER['PHP_AUTH_USER']))
  {
    if ($_SERVER['PHP_AUTH_USER'] == sfConfig::get('app_admin_user') &&
        $_SERVER['PHP_AUTH_PW'] == sfConfig::get('app_admin_password'))
    {
      $this->getUser()->setAuthenticated(true);
 
      return $this->redirect($request->getUri());
    }
  }
  $this->getResponse()->setStatusCode(401);
  $this->getResponse()->setHttpHeader('WWW_Authenticate', 'Basic realm="Authentication required"');
 
  return sfView::NONE;
}

E il gioco è fatto. Eventualmente si può personalizzare il messaggio “Authentication required”.
Nei test funzionali, sarà possibile effettuare il login usando il metodo setAuth(), con l’accortezza di seguire il redirect dopo il primo get.

1
2
3
4
5
$browser->
  setAuth('admin', 'admin')->
  get('/')->
  with('response')->isRedirected()->followRedirect()->
 // eccetera...

One Reply to “Basic authentication”

  1. E per il logut? Esiste un modo per cancellare le credenziali http?

Leave a Reply

Your email address will not be published. Required fields are marked *