Piotr Krajewski

Piotr Krajewski web application
programmer

Temat: Zend_auth - autentykacja za pomocą e-mail bądz login

Witam wszystkich,

mam sobie taki kawałek kodu potrzebnego do logowania userów w serwisie:

if ($this->getRequest()->isPost())
{
if ($form->isValid($this->_request->getPost()))
{
$data = $form->getValues();
$auth = Zend_Auth::getInstance();
$dbUser = new Model_DbTable_User();
$userMapper = new Model_UserMapper();
$userData = $userMapper->findByUsername($data['email']);

if ('0' == $userData->status)
{
$this->_helper->FlashMessenger(array('error' => 'Twoje konto jest nie aktywne! Aktywuj konto po przez link w e-mailu aktywacyjnym! <a href="'.$this->view->url(array(), 'activationCode', true).'?q='.$userData->single_access_token.'" title="Wyślij ponownie kod aktywacyjny">Wyślij ponownie kod aktywacyjny</a>'));
}
else
{
$authAdapter = new Zend_Auth_Adapter_DbTable($dbUser->getAdapter(), 'users');
$authAdapter->setIdentityColumn('email')->setCredentialColumn('password');
$authAdapter->setIdentity(htmlspecialchars($data['email']))->setCredential($dbUser->generatePassword($data['password'], $data['email']));
$authAdapter->setCredentialTreatment("? AND status = '".$userData->status."'");
$result = $auth->authenticate($authAdapter);

if ($result->isValid())
{
$user = new Model_User(array('id' => $userData->id, 'role' => 1, 'last_login_date' => new Zend_Db_Expr('NOW()')));
$userMapper->save($user);
$user = null;

$auth->getStorage()->write($authAdapter->getResultRowObject());

if (!$userData->update_date)
{
$returnUrl = $this->view->url(array(), 'changeProfile', true);
}
else
{
$returnUrl = $this->view->url(array(), 'profile', true);
if (isset($session->referer))
{
$returnUrl = $session->referer;
}
unset($session->referer);
}
$this->_redirect($returnUrl);
}
else
{
$this->_helper->FlashMessenger(array('error' => 'Wpisany został niepoprawny login lub hasło'));
}
}
$this->_redirect($this->view->url(array(), 'signin', true));
}
}


mój problem leży w autentykacji usera za pomocą logina LUB e-maila jako nazwy użytkownika. Obecnie jest jedynie za pomocą e-maila:


$authAdapter->setIdentity(htmlspecialchars($data['email']))->setCredential($dbUser->generatePassword($data['password'], $data['email']));


moje pytanie brzmi: jak dodać do tego możliwość logowania za pomocą loginu?

konto usunięte

Temat: Zend_auth - autentykacja za pomocą e-mail bądz login

Podłączam się do pytania ostatnio miałem podobny problem i rozwiązałem to chyba troche mało elegancko sprawdzając po prostu czy pierwszy parametr jest emailem

Temat: Zend_auth - autentykacja za pomocą e-mail bądz login

Zend_Auth_Adapter_DbTable jest fajne do standardowych zastosowań
a do niestandardowych:

class My_Auth_Adapter_ForCustomLogin implements Zend_Auth_Adapter_Interface
{
public function authenticate()
{
//i tutaj wlasna logika ktora sprawdza czy identity jest mailem czy loginem i podejmuje odpowiednie sprawdzanie i dzialanie
}
}
Krzysztof Korzeniewski edytował(a) ten post dnia 22.08.10 o godzinie 15:30
Piotr Krajewski

Piotr Krajewski web application
programmer

Temat: Zend_auth - autentykacja za pomocą e-mail bądz login


{
//i tutaj wlasna logika ktora sprawdza czy identity jest mailem czy loginem i podejmuje odpowiednie sprawdzanie i dzialanie
}


w tym miejscu dać zwykłe SQL które będzie sprawdzało czy dane się zgadzają (login / email) i jednoczesnie wywalić to:

$authAdapter = new Zend_Auth_Adapter_DbTable($dbUser->getAdapter(), 'users');
$authAdapter->setIdentityColumn('email')->setCredentialColumn('password');
$authAdapter->setIdentity(htmlspecialchars($data['email']))->setCredential($dbUser->generatePassword($data['password'], $data['email']));
$authAdapter->setCredentialTreatment("? AND status = '".$userData->status."'");
$result = $auth->authenticate($authAdapter);


czy może masz co innego na mysli ?

Temat: Zend_auth - autentykacja za pomocą e-mail bądz login

miałem na myśli własny adapter logowania
zresztą zobacz sobie jak jest napisany Zend_Auth_Adapter_DbTable to się załamiesz (chyba że coś poprawiali od 1.10.3)
na jego podstawie jesteś w stanie napisać sobie własny adapter

konto usunięte

Temat: Zend_auth - autentykacja za pomocą e-mail bądz login

Ja generalnie używam Doctrine i mam to rozwiązane tak:


$username = $this->emailToUsername($username);
$passwordHashed = ####;

$adapter = $this->getAuthAdapter();
$adapter->setIdentityColumn('username')
$adapter->setCredentialColumn('password');
$adapter->setIdentity($username);
$adapter->setCredential($passwordHashed);
$auth = $this->getAuth();
$result = $auth->authenticate($adapter);





public function emailToUsername($email)
{
if (Zend_Validate::is($email, 'EmailAddress')) {
$user = Doctrine_Core::getTable('User_Model_User')
->findOneBy('email', $email);
if ($user) {

return $user->username;
}
}

return $email;
}



Jeżeli używasz Zendowskiego rozwiązania do obsługi bazy to wystarczy przerobić zapytanie z Doctrine na Zenda i powinno śmigać.Adrian Ogórek edytował(a) ten post dnia 22.08.10 o godzinie 23:47



Wyślij zaproszenie do