Sie sollten Ihren eigenen Zend_Auth_Adapter erstellen. Dieser Adapter wird versuchen, sich gegen Ihre drei Ressourcen zu authentifizieren und wird ihn in einer privaten Mitgliedsvariablen kennzeichnen, so dass Sie wissen können, welche der Anmeldeversuche erfolgreich authentifiziert wurden.
Um Ihren Auth Adapter zu erstellen, können Sie die Zend_Auth_Adapter_DbTable als Grundlage nehmen.
Also, in der __construct statt nur einen DbTable-Adapter übergeben, können Sie die drei Adapter in jeder Ressource übergeben. Sie werden nur dann auf diese Weise arbeiten, wenn jeder andere Ressourcen verwendet, wie z. B. LDAP oder sogar eine andere Datenbank. Wenn nicht, können Sie nur einen Adapter übergeben und drei verschiedene Tabellennamen in den Konfigurationsoptionen festlegen. Hier
ist das Beispiel von Zend_Auth_Adapter_DbTable:
/**
* __construct() - Sets configuration options
*
* @param Zend_Db_Adapter_Abstract $zendDb
* @param string $tableName
* @param string $identityColumn
* @param string $credentialColumn
* @param string $credentialTreatment
* @return void
*/
public function __construct(Zend_Db_Adapter_Abstract $zendDb, $tableName = null, $identityColumn = null,
$credentialColumn = null, $credentialTreatment = null)
{
$this->_zendDb = $zendDb;
// Here you can set three table names instead of one
if (null !== $tableName) {
$this->setTableName($tableName);
}
if (null !== $identityColumn) {
$this->setIdentityColumn($identityColumn);
}
if (null !== $credentialColumn) {
$this->setCredentialColumn($credentialColumn);
}
if (null !== $credentialTreatment) {
$this->setCredentialTreatment($credentialTreatment);
}
}
Das Verfahren unten, von Zend_Auth_Adapter_DbTable, versuchen gegen einen Tisch zu authentifizieren, können Sie es ändern in drei Tabellen, um zu versuchen, und für jeden, wenn Sie bekommen Sucess , legen Sie dies als ein Flag in der privaten Membervariable fest. Etwas wie $ result ['group1'] = 1; Sie geben 1 für jeden erfolgreichen Anmeldeversuch ein.
/**
* authenticate() - defined by Zend_Auth_Adapter_Interface. This method is called to
* attempt an authentication. Previous to this call, this adapter would have already
* been configured with all necessary information to successfully connect to a database
* table and attempt to find a record matching the provided identity.
*
* @throws Zend_Auth_Adapter_Exception if answering the authentication query is impossible
* @return Zend_Auth_Result
*/
public function authenticate()
{
$this->_authenticateSetup();
$dbSelect = $this->_authenticateCreateSelect();
$resultIdentities = $this->_authenticateQuerySelect($dbSelect);
if (($authResult = $this->_authenticateValidateResultset($resultIdentities)) instanceof Zend_Auth_Result) {
return $authResult;
}
$authResult = $this->_authenticateValidateResult(array_shift($resultIdentities));
return $authResult;
}
Sie eine gültige $ authresult nur zurück, wenn einer der drei Anmeldeversuche wurden erfolgreich authentifiziert.
Jetzt in Ihrem Controller, nach versuchen Sie sich anmelden:
public function loginAction()
{
$form = new Admin_Form_Login();
if($this->getRequest()->isPost())
{
$formData = $this->_request->getPost();
if($form->isValid($formData))
{
$authAdapter = $this->getAuthAdapter();
$authAdapter->setIdentity($form->getValue('user'))
->setCredential($form->getValue('password'));
$result = $authAdapter->authenticate();
if($result->isValid())
{
$identity = $authAdapter->getResult();
Zend_Auth::getInstance()->getStorage()->write($identity);
// redirect here
}
}
}
$this->view->form = $form;
}
private function getAuthAdapter()
{
$authAdapter = new MyAuthAdapter(Zend_Db_Table::getDefaultAdapter());
// Here the three tables
$authAdapter->setTableName(array('users','users2','users3'))
->setIdentityColumn('user')
->setCredentialColumn('password')
->setCredentialTreatment('MD5(?)');
return $authAdapter;
}
Der Schlüssel hier ist die Linie unten, die in Ihrer benutzerdefinierten Auth Adapter implemeted werden:
$identity = $authAdapter->getResult();
Sie können nehmen diese Form Zend_Auth_Adapter_DbTable als Basis:
/**
* getResultRowObject() - Returns the result row as a stdClass object
*
* @param string|array $returnColumns
* @param string|array $omitColumns
* @return stdClass|boolean
*/
public function getResultRowObject($returnColumns = null, $omitColumns = null)
{
// ...
}
die Zeile Diese Rückkehr in die Anmeldung ein angepaßtes tmtemp wenn erfolgreich authentifiziert. Sie werden also Ihre Methode getResult() erstellen, die diese Zeile und die Flags $ this-> result ['groupX'] zurückgeben kann. Etwas wie:
public function authenticate()
{
// Perform the query for table 1 here and if ok:
$this->result = $row->toArrray(); // Here you can get the table result of just one table or even merge all in one array if necessary
$this->result['group1'] = 1;
// and so on...
$this->result['group2'] = 1;
// ...
$this->result['group3'] = 1;
// Else you will set all to 0 and return a fail result
}
public function getResult()
{
return $this->result;
}
Schließlich können Sie Zend_Acl verwenden Kontrolle über Ihre Ansichten und andere Maßnahmen zu ergreifen. Da Sie die Flaggen in der Zend Auth Speicher haben, können Sie als als Rollen verwenden:
http://framework.zend.com/manual/en/zend.auth.introduction.html
http://zendguru.wordpress.com/2008/11/06/zend-framework-auth-with-examples/
http://alex-tech-adventures.com/development/zend-framework/61-zendauth-and-zendform.html
:
$this->addRole(new Zend_Acl_Role($row['group1']));
Hier einige Ressourcen http://alex-tech-adventures.com/development/zend-framework/62-allocation-resources-and-permissions-with-zendacl.html
http://alex-tech-adventures.com/development/zend-framework/68-zendregistry-and-authentication-improvement.html
Müssen Sie haben unterschiedliche Identitäten für jede Gruppe verwenden würde? Oder ist es nur eine Frage der Authentifizierung gegen einen anderen Tisch? – Gordon
@Gordon müssten sie separate Identitäten sein (sagen wir CMS-Nutzer, Großhändler und Endbenutzer). Ich könnte alle drei Dinge gleichzeitig sein. –
Prior ZF Dies war die Domäne von PEAR :: LiveUser. http://devzone.zend.com/node/view/id/1001 – mario