Symfony – własny formularz logowania

Tworząc formularz logowania można skorzystać z symfonowego pluginu sfDoctrineGuardPlugin lub napisać coś samodzielnie by wiedzieć jak logowanie funkcjonuje.
Poniżej krótki tutorial, jak wykonać działający panel logowania w symfony.

Tworzę własną klasę UzytkownikFormLogowania.
Plik umieszczony jest w katalogu lib/form/doctrine

<?php

class UzytkownikFormLogowania extends BaseForm {

    public function setup() {

        $this->setWidgets(array(
            'username' => new sfWidgetFormInputText(array('label' => 'login')),
            'password' => new sfWidgetFormInputPassword(array('label' => 'Hasło', 'type' => 'password'))
        ));

        $this->setValidators(array(
            'username' => new sfValidatorString(array('required'=>TRUE), array('required' => 'Podaj login')),
            'password' => new sfValidatorString(array('required'=>TRUE), array('required' => 'Podaj hasło')),
        ));

        $this->validatorSchema->setPostValidator(new sfValidatorCallback(array('callback'=>array($this, 'sprawdzUsera'))));
        $this->widgetSchema->setNameFormat('user[%s]');
    }
}

Za pomocą tej klasy generuję później formularz logowania.

W klasie UzytkownikFormLogowania definiuję używane widgety, i tak:

  • sfWidgetFormInputText – dla loginu
  • sfWidgetFormInputPassword – dla hasła

Dodatkowo, widgetom dodaję odpowiednie validatory które wstępnie sprawdzają czy wprowadzone dane są prawidłowe, oraz czy w ogóle jakieś dane zostały wprowadzone.

Na samym końcu dodaję Postvalidator, który zostaje wywołany po tym gdy formularz przejdzie poprawnie podstawową walidację.

Jak wygląda postvalidator?… Proszę:

    public function sprawdzUsera($validator, $values) {
        if ($values['username'] && $values['password']) {
            $logowanyUser = sfContext::getInstance()->getRequest()->getParameter('user');
            $obiektUser = Doctrine_Core::getTable('uzytkownik')->findOneByLoginAndHaslo($values['username'], $values['password']);

            if ($obiektUser) {
                //kasowanie poprzednich uprawnień
                if (sfContext::getInstance()->getUser()->isAuthenticated()) {
                    sfContext::getInstance()->getUser()->getAttributeHolder()->removeNamespace('ns_user');
                    sfContext::getInstance()->getUser()->setAuthenticated(false);
                    sfContext::getInstance()->getUser()->clearCredentials();
                }

                //teraz uwierzytelniamy nowego użytkownika
                sfContext::getInstance()->getUser()->setAuthenticated(true);

                //W sesji przechowujemy wszystkie informacje na temat użytkownika
                sfContext::getInstance()->getUser()->setAttribute('id', $obiektUser->getId(), 'ns_user');
                sfContext::getInstance()->getUser()->setAttribute('username', $obiektUser->getLogin(), 'ns_user');

                //ustawienie grupy uprawnień użytkownika
                sfContext::getInstance()->getUser()->addCredential('user');
            } else {
                $error = new sfValidatorError($validator, "Niewłaściwy login lub hasło");
                throw new sfValidatorErrorSchema($validator, array('username' => $error));
            }
        }
        return $values;
    }

 

Pobieramy tutaj informacje od logującego się użytkownika poprzez objekt sfContext i porównujemy to z tym co mamy w bazie danych poprzez doctrine.

Jeśli user wprowadzi poprawne dane niezbędne do logowania, sprawdzam czy ktoś przypadkiem nie jest uwierzytelniony i kasuję te informacje.

//kasowanie poprzednich uprawnień
if (sfContext::getInstance()->getUser()->isAuthenticated()) {
sfContext::getInstance()->getUser()->getAttributeHolder()->removeNamespace('ns_user');
sfContext::getInstance()->getUser()->setAuthenticated(false);
sfContext::getInstance()->getUser()->clearCredentials();
}

Teraz już można uwierzytelnić logującego się użytkownika

sfContext::getInstance()->getUser()->setAuthenticated(true);

Wszystkie niezbędne informacje o userze przechowuję w kilku zmiennych w przestrzeni ns_user.

//W sesji przechowujemy wszystkie informacje na temat użytkownika
sfContext::getInstance()->getUser()->setAttribute('id', $obiektUser->getId(), 'ns_user');
sfContext::getInstance()->getUser()->setAttribute('username', $obiektUser->getLogin(), 'ns_user');

//ustawienie grupy uprawnień użytkownika
sfContext::getInstance()->getUser()->addCredential('user');

Akcja logowania:

    public function executeLoginpanel(sfWebRequest $request) {

        $this->form = new uzytkownikFormLogowania();        //Tworzenie nowego formularza logowania
        if($request->isMethod('post'));                      //Sprzawdzanie czy wysłano formularz metodą POST, czyli czy wciśnięto przycisk wyślij...
        {
            $this->form->bind($request->getParameter('user')); //Ppobiera tablicę z formularza 'user'
            if($this->form->isValid()){
                return $this->redirect('@homepage');
            }
        }

        $this->loginUsera = $this->getUser()->getAttribute('username','','ns_user');

Tutaj chyba nie ma co tłumaczyć…

To samo wylogowanie…

    public function executeLogout($request) {
        //Dane uwierzytelniania zostają usunięte
        if ($this->getUser()->isAuthenticated()) {
            $this->getUser()->getAttributeHolder()->removeNamespace('nc_user');
            $this->getUser()->setAuthenticated(false);
            $this->getUser()->clearCredentials();
        }
        return $this->redirect('@homepage');
    }

A sam element template?
U mnie jet trochę bajzel w tym temacie, ale może osoba to czytająca dojdzie :)

<div>

  <div id="logowanie">
      <?php if(!$sf_user->isAuthenticated()): ?>
      <?php echo form_tag('@login',array('method'=>'post', 'id'=>'loginform'))?>
      <?php echo $form->renderHiddenFields(); ?>
      <?php echo $form->renderGlobalErrors(); ?>
      <?php echo $form['username']->renderLabel(); ?>
      <?php echo $form['username']; ?>
      <?php echo $form['password']->renderLabel(); ?>
      <?php echo $form['password']; ?>
      <input type="image" src="/images/bg_submit_btn.png" />
    </form>
    <?php endif; ?>
    <?php if ($sf_user->isAuthenticated()) { ?> <div>
    <span>Zalogowany jako: </span><span>
    <?php echo $loginUsera; ?></span></div>
    <div><span>Wyloguj: </span>
<?php echo form_tag('@logout', array('method'=>'POST', 'id'=>'Wyloguj', 'class'=>'right')) ?>
<input type="image" src="/images/bg_submit_btn.png"  /></form></div>
    <?php } else { echo form_tag('@create', array('method'=>'post', 'id'=>'createacount'))?></form>
    <span><?php echo __("Załóż konto");?></span>
<?php echo image_tag('bg_submit_btn.png', 'alt=submit'); }?>
    </form>
  </div>
    <?php if (!$sf_user->isAuthenticated()) {?>
  <div id="newsletter">
    <?php echo form_tag('@newsletter', array('method'=>'post', 'id'=>'newsletter'))?>
      <label for="addtonewsetter"><?php echo __("Newsletter");?></label><input type="text" name="addtonewsetter" id="addtonewsetter" value="<?php echo __("Twój mail...")?>"/> <?php echo image_tag('bg_submit_btn.png', 'alt=submit'); ?>
    </form>
  </div>
    <?php } ?>
</div>

 

Leave a Reply