2011-08-04 43 views
5

Khi người dùng của tôi đăng nhập, tôi hiển thị chi tiết của họ (tên, email) trên giao diện người dùng. Khi họ cập nhật tiểu sử của họ, tôi muốn hiển thị chi tiết được cập nhật mà không yêu cầu người dùng đăng xuất và đăng nhập lại.Zend_Auth và tự động thay đổi chi tiết người dùng trên giao diện người dùng

Chi tiết giao diện người dùng được truy xuất từ ​​Zend_Auth qua trợ giúp xem. Zend_Auth đang lưu trữ chi tiết 'danh tính' trong một phiên.

Làm thế nào tôi nên đi về việc cập nhật các chi tiết trong phiên ?:

  • Tôi đang cân nhắc lấy thông tin đăng nhập của người dùng từ cơ sở dữ liệu và sử dụng chúng để gọi Zend_Auth-> xác thực() một lần nữa. Vấn đề là tôi không biết mật khẩu, chỉ có md5 băm. Tôi có thể xem xét một phương pháp mới, reauthenticate(), cấu hình bộ điều hợp để bỏ qua md5 và muối, nhưng điều này nghe có vẻ mất thời gian.

  • Tôi đã cân nhắc việc viết trực tiếp vào không gian tên phiên Zend_Auth, nhưng điều này nghe giống như một công thức gây rắc rối?

Bạn có gặp phải vấn đề tương tự không? Làm thế nào bạn có thể xoay xở được?

Ý tưởng của bạn được nhiều người đánh giá cao!

+0

Vì vậy, bạn đang sử dụng email làm nhận dạng và tải tên từ cơ sở dữ liệu trong trợ giúp của bạn? –

Trả lời

0

Đây là cách tôi giải quyết vấn đề trong thời gian này. Bạn không chắc chắn nhưng nếu đó là giải pháp tốt nhất:

  • tạo một wrapper cho Zend_Auth
  • bao gồm getAuthAdapter phương pháp ($ thô)
  • cấu hình adapter khác nhau, tùy thuộc vào giá trị của $ thô

    if (false === $raw) { 
        $this->_authAdapter->setCredentialTreatment('SHA1(CONCAT(?,salt))'); 
    } else { 
        $this->_authAdapter->setCredentialTreatment(); 
    } 
    
4

Bạn có thể cập nhật thông tin nhận dạng Zend_auth cho người dùng hiện đã đăng nhập. Hành động rất đơn giản chỉ cập nhật tên người dùng có thể như sau:

public function editAction() { 


    // check if user is logged, etc, and then 
    // show the edit user form and process the data after submission. 

    $userForm = new My_Form_EditUser();  


    if ($this->getRequest()->isPost()) { 
     if ($userForm->isValid($_POST)) { 

      // process the submitted data, 
      // and when you are sure that everything went ok, 
      // update the zend_auth identity 


      $authData = Zend_Auth::getInstance()->getIdentity(); 

      // this line would depend on the format of your 
      // identity data and a structure of your 
      // actual form. 
      $authData->property->nickname = $formData['user']['nickname']; 

      $this->_helper->FlashMessenger('Your data was changed'); 
      return $this->_redirect('/'); 
     } 
    }  

    $this->view->form = $userForm; 
} 

Hy vọng điều này sẽ hữu ích.

+0

Xin chào Marcin. Đối với điều này để làm việc thực thể cần phải được lưu trữ như là một đối tượng. Có đúng không? –

+0

@Kim. Tôi cũng nên làm việc với mảng. Trong ví dụ này, nó là một đối tượng chỉ vì trong dự án hiện tại của tôi, tôi lưu trữ danh tính ở định dạng như vậy.Nhưng nếu bạn sử dụng mảng, bạn sẽ có thể sử dụng ký pháp mảng để thay đổi nhận dạng. – Marcin

2

Điều tôi thực sự muốn là phương thức trên Zend_Auth::setIdentity($user).

Nhưng trong trường hợp không có phương pháp như vậy, tôi đã sử dụng hack trong đó tôi đã tạo bộ điều hợp xác thực luôn trả về thành công và đặt danh tính cho cùng một đối tượng người dùng mà tôi đã tạo trong bộ điều hợp chính hãng "thực" . Sau đó, tôi chỉ cần gọi Zend_Auth::authenticate($adapter) với bộ điều hợp đó và nó đặt danh tính nội bộ.

Bây giờ, nhìn mosre chặt chẽ tại bên trong của Zend_Auth::authenticate(), tôi thấy rằng những gì chúng ta có thể làm chỉ là:

Zend_Auth::getInstance()->getStorage()->write($user);

+0

Xin chào David. Làm thế nào điều này sẽ làm việc? Zend_Auth không có phương thức write() và không có phương thức ma thuật __call() nào? –

+0

D'oh! Typo. Đúng là 'Zend_Auth :: getInstance() -> getStorage() -> write ($ user);'. Câu trả lời đúng. –

Các vấn đề liên quan