Okay, zunächst eine Klärung darüber, wie Auth Komponente :: login funktioniert. In Cake 2.x führt diese Methode keine Authentifizierung durch, sondern erstellt das Auth.User-Array in Ihrer Sitzung. Sie müssen die eigentliche Authentifizierung selbst implementieren (das Benutzermodell ist hierfür ein natürlicher Ort). Eine einfache Authentifizierungsmethode könnte folgendermaßen aussehen:
App::uses('AuthComponent', 'Controller/Component');
public function authenticate($data) {
$user = $this->find('first', array(
'conditions' => array('User.login' => $data['login']),
));
if($user['User']['password'] !== AuthComponent::password($data['password']) {
return false;
}
unset($user['User']['password']); // don't forget this part
return $user;
// the reason I return the user is so I can pass it to Authcomponent::login if desired
}
Jetzt können Sie diese von jedem Controller aus verwenden, solange das Benutzermodell geladen ist. Möglicherweise wissen Sie, dass Sie es laden können, indem Sie Controller::loadModel('User')
aufrufen.
Wenn Sie jede Anfrage authentifizieren wollen, dann sollten Sie dann in der before Methode der AppController setzen:
public function beforeFilter() {
$this->loadModel('User');
if(!$this->User->authenticate($this->request->data)) {
throw new UnauthorizedException(__('You don\'t belong here.'));
}
}
Alle der oben genannten geht davon aus, dass Sie POST-Werte für Login und Passwort passieren jedes Mal. Ich denke Token-Authentifizierung ist definitiv der bessere Weg zu gehen, aber für die Inbetriebnahme sollte dies funktionieren. Einige Nachteile sind das Senden von Passwort in Klartext (es sei denn, Sie benötigen SSL), jede Anfrage und die wahrscheinlich hohe CPU-Nutzung des Hash-Algorithmus jedes Mal. Trotzdem hoffe ich, dass Sie dadurch eine bessere Vorstellung davon bekommen, wie Sie die Authentifizierung mit CakePHP durchführen können.
Lassen Sie mich wissen, wenn etwas geklärt werden muss.
Update: Seit dieser Veröffentlichung habe ich herausgefunden, dass Sie AuthComponent :: Login ohne Parameter verwenden können, aber ich bin kein Fan davon. Von der CakePHP Dokumentation:
In 2.x $this->Auth->login($this->request->data) will log the user in with
whatever data is posted, whereas in 1.3 $this->Auth->login($this->data)
would try to identify the user first and only log in when successful.
Vielen Dank für Ihre Antwort. Ich habe mich gefragt, wie ich mich bei jeder Aktion authentifizieren kann, da eine mobile App, die die API verwendet, keine Sitzung verwalten kann –