CakePHP Auth-Komponente mit 2 Tabellen

CakePHP Version 1.2.5

Ich möchte, dass ein einzelner Benutzer mehrere E-Mail-Adressen hat.
Ich möchte, dass ein einzelner Benutzer ein einzelnes Passwort hat.
Ich möchte, dass sich Benutzer mit einer ihrer mehreren E-Mail-Adressen und einem einzigen Passwort anmelden.

Ich habe eine Benutzertabelle mit einer ID und einem Kennwortfeld erstellt.
Ich habe eine user_email_addresses-Tabelle mit einem id-Feld, einem user_id-Feld und einem email_address-Feld erstellt.

Frage:
Wie ändere ich die Auth-Komponente minimal, um nach dem "Benutzernamen" in diesem Fall "email_address" in der user_email_addresses-Tabelle und dem "Passwort" in der users-Tabelle zu suchen?

Es sieht so aus, als würde dies durch Ändern der Identifizierungsmethode in der Auth-Komponente erreicht. Ich halte es jedoch für eine schlechte Idee, die Auth-Komponente direkt zu ändern - gibt es Ideen, wie die Identifizierungsmethode erweitert und möglicherweise noch geändert werden kann?http://cakebaker.42dh.com/2009/09/08/extending-cakephps-core-components/ oder möglicherweise ein anderes Authentifizierungsobjekt benennen?

Startlinie 774:

    function identify($user = null, $conditions = null) {
    if ($conditions === false) {
        $conditions = null;
    } elseif (is_array($conditions)) {
        $conditions = array_merge((array)$this->userScope, $conditions);
    } else {
        $conditions = $this->userScope;
    }
    if (empty($user)) {
        $user = $this->user();
        if (empty($user)) {
            return null;
        }
    } elseif (is_object($user) && is_a($user, 'Model')) {
        if (!$user->exists()) {
            return null;
        }
        $user = $user->read();
        $user = $user[$this->userModel];
    } elseif (is_array($user) && isset($user[$this->userModel])) {
        $user = $user[$this->userModel];
    }

    if (is_array($user) && (isset($user[$this->fields['username']]) || isset($user[$this->userModel . '.' . $this->fields['username']]))) {

        if (isset($user[$this->fields['username']]) && !empty($user[$this->fields['username']])  && !empty($user[$this->fields['password']])) {
            if (trim($user[$this->fields['username']]) == '=' || trim($user[$this->fields['password']]) == '=') {
                return false;
            }
            $find = array(
                $this->userModel.'.'.$this->fields['username'] => $user[$this->fields['username']],
                $this->userModel.'.'.$this->fields['password'] => $user[$this->fields['password']]
            );
        } elseif (isset($user[$this->userModel . '.' . $this->fields['username']]) && !empty($user[$this->userModel . '.' . $this->fields['username']])) {
            if (trim($user[$this->userModel . '.' . $this->fields['username']]) == '=' || trim($user[$this->userModel . '.' . $this->fields['password']]) == '=') {
                return false;
            }
            $find = array(
                $this->userModel.'.'.$this->fields['username'] => $user[$this->userModel . '.' . $this->fields['username']],
                $this->userModel.'.'.$this->fields['password'] => $user[$this->userModel . '.' . $this->fields['password']]
            );
        } else {
            return false;
        }
        $model =& $this->getModel();
        $data = $model->find(array_merge($find, $conditions), null, null, 0);
        if (empty($data) || empty($data[$this->userModel])) {
            return null;
        }
    } elseif (!empty($user) && is_string($user)) {
        $model =& $this->getModel();
        $data = $model->find(array_merge(array($model->escapeField() => $user), $conditions));

        if (empty($data) || empty($data[$this->userModel])) {
            return null;
        }
    }

    if (!empty($data)) {
        if (!empty($data[$this->userModel][$this->fields['password']])) {
            unset($data[$this->userModel][$this->fields['password']]);
        }
        return $data[$this->userModel];
    }
    return null;
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage