2012-01-25 12 views
5

Zrobiłem system logowania przez zend auth Oto kodZend sesji i Zend auth

// userAuthentication 
    public function authAction(){ 
     $request  = $this->getRequest(); 
     $registry = Zend_Registry::getInstance(); 
     $auth  = Zend_Auth::getInstance(); 
     $DB = $registry['DB']; 
      $authAdapter = new Zend_Auth_Adapter_DbTable($DB); 
       $authAdapter->setTableName('user') 
          ->setIdentityColumn('user_name') 
          ->setCredentialColumn('user_password'); 

     $username = $request->getParam('username'); 
     $password = $request->getParam('password'); 
     $authAdapter->setIdentity($username); 
     $authAdapter->setCredential($password); 
     $result = $auth->authenticate($authAdapter); 

     if($result->isValid()){ 
      $data = $authAdapter->getResultRowObject(null,'password'); 
      $auth->getStorage()->write($data); 
      $this->_redirect('/login/controlpannel'); 
     }else{ 
      $this->_redirect('/login/login'); 
     } 
    } 

teraz działać poprawnie. Istnieje user_id (kolumna) w user (table), gdzie jest również nazwa użytkownika i hasło. Muszę dostać tego konkretnego user_id z tej tabeli, która po prostu zalogować się i umieścić ją w sesji przez

$user_session = new Zend_Session_Namespace('user_session'); 
$user_session->username = $username; 
$user_id->user_id  = $user_id; 

tak, że mogę zapytać pewne informacje przed tym $ user_id i przekazać wynik do widzenia (nazwa) ControlPanel

+1

dlaczego chcesz wprowadzić sesję ręcznie? Utworzy sesję po zalogowaniu, a otrzymasz ją z magazynu. –

+0

@Teez jak mogę uzyskać user_id z magazynu? –

+1

$ data = Zend_Auth :: getInstance() -> getStorage() -> read(); $ this-> view-> username = $ data-> nazwa_użytkownika; $ this-> view-> id = $ data-> user_id; –

Odpowiedz

8

Uzyskaj identyfikator użytkownika z pamięci:

$userInfo = Zend_Auth::getInstance()->getStorage()->read(); 

echo $userInfo->user_id; 
3

można uzyskać dostęp do danych drogą Teez sugerować lub po prostu wyciągnąć go z Zend_Session_Namespace.

15.1.3.1. Domyślna trwałość w sesji PHP
Domyślnie Zend_Auth zapewnia trwałe przechowywanie tożsamości po udanej próbie uwierzytelnienia przy użyciu sesji PHP. Po pomyślnej próbie uwierzytelnienia funkcja Zend_Auth :: authenticate() przechowuje tożsamość z wyniku uwierzytelnienia do trwałej pamięci. O ile nie skonfigurowano inaczej, Zend_Auth używa klasy pamięci o nazwie Zend_Auth_Storage_Session, która z kolei używa Zend_Session. Niestandardowa klasa może być zamiast tego używana przez dostarczenie obiektu implementującego Zend_Auth_Storage_Interface do Zend_Auth :: setStorage().

Zend_Auth_Storage_Session używa przestrzeni nazw sesji 'Zend_Auth'. Ta przestrzeń nazw może zostać nadpisana przez przekazanie innej wartości do konstruktora Zend_Auth_Storage_Session, a ta wartość jest wewnętrznie przekazana do konstruktora Zend_Session_Namespace. To powinno być przed próbą uwierzytelnienia, ponieważ Zend_Auth :: authenticate() wykonuje automatyczne przechowywanie tożsamości .

+0

thanx za info sir –

+0

co za wspaniała odpowiedź. Rozwiązał mój problem. Dziękuję :-) –

8

Podczas gdy już udzielono odpowiedzi, często używam funkcji getIdentity() niż łańcuch getStorage()->read(). Przykłady poniżej.

// to check if authenticated 
Zend_Auth::getInstance()->hasIdentity(); 

// to actually get the details from storage 
Zend_Auth::getInstance()->getIdentity()->user_id; 

// if I need to use the identity over and over 
$identity = Zend_Auth::getInstance()->getIdentity(); 
$userId = $identity->user_id; 
1

To jest moje podejście i to s działa ładny: 1-I zacząć od zdefiniowania funkcji init w bootstrap

protected function _initSession() 
{ 

    $UserSession = new Zend_Session_Namespace('UserSession'); 
    $UserSession->setExpirationSeconds(/* you may fix a limit */); 
    Zend_Registry::set('UserSession', $UserSession); 
} 

/* w akcji logowania, po poprawnej nazwy użytkownika & pwd */

// Create session 
    $UserSession = Zend_Registry::get('UserSession'); 
// Get the user from database 
$db = Zend_Db_Table::getDefaultAdapter(); 
$user = $db->fetchRow("SELECT * FROM user_table WHERE user_email = '".$user_email."'"); 

//then you assign to $user to $UserSession variable : 
$UserSession->user = $user; 

//finaly don't forget to unset session variable in the Logout action ... 
+0

pamiętaj o odkażeniu/parametryzacji e-maila użytkownika przed takim zapytaniem;) – Asmodiel

2

przypisywania tablicy do sesji, należy podać nazwę sesji, tworząc obszar, czyli trzeba zrobić setStorage zanim zrobisz getStorage.

trzeba napisać kod tak:

// userAuthentication 
    public function authAction(){ 
     $request  = $this->getRequest(); 
     $registry = Zend_Registry::getInstance(); 
     $auth  = Zend_Auth::getInstance(); 
     $DB = $registry['DB']; 
      $authAdapter = new Zend_Auth_Adapter_DbTable($DB); 
       $authAdapter->setTableName('user') 
          ->setIdentityColumn('user_name') 
          ->setCredentialColumn('user_password'); 


     $username = $request->getParam('username'); 
     $password = $request->getParam('password'); 
     $authAdapter->setIdentity($username); 
     $authAdapter->setCredential($password); 
     $authAdapter->setStorage(new Zend_Auth_Storage_Session('User_Auth')); 
     $result = $auth->authenticate($authAdapter); 
     if($result->isValid()){ 
     $data = $authAdapter->getResultRowObject(null,'password'); 
     $auth->getStorage()->write($data); 
     $this->_redirect('/login/controlpannel'); 
     }else{ 
      $this->_redirect('/login/login'); 
     } 
    } 

a następnie, aby uzyskać wartość pamięci, należy użyć tego:

$x = new Zend_Auth_Storage_Session('User_Auth'); 
$y = $x->read(); 

i masz wszystko w $ y jako obiekt.

Ciesz się!

0
użytkownik = Zend_Auth :: getInstance() -> getIdentity(); jeśli (! @ $ Ten-> użytkownik) { $ objSession-> errorMsg = "Proszę się najpierw zalogować ..!"; $ this -> _ przekierowanie ("/ user/login"); } ?>
+0

użyj tego kodu z modyfikacją według danych ur –