Permalink
Browse files

Adding a logout callback to authenticate objects.

Adding tests for the callback.
Adding doc blocks for the new callback.
Fixes #1758
  • Loading branch information...
1 parent be09c67 commit 71933f5cf53a51144e123f531e28e534af9f9610 @markstory markstory committed Jul 3, 2011
@@ -98,6 +98,18 @@ protected function _findUser($username, $password) {
*/
abstract public function authenticate(CakeRequest $request, CakeResponse $response);
+/**
+ * Allows you to hook into AuthComponent::logout(),
+ * and implement specialized logout behaviour.
+ *
+ * All attached authentication objects will have this method
+ * called when a user logs out.
+ *
+ * @param array $user The user about to be logged out.
+ * @return void
+ */
+ public function logout($user) { }
+
/**
* Get a user based on information in the request. Primarily used by stateless authentication
* systems like basic and digest auth.
@@ -108,4 +120,4 @@ protected function _findUser($username, $password) {
public function getUser($request) {
return false;
}
-}
+}
@@ -516,6 +516,9 @@ public function login($user = null) {
/**
* Logs a user out, and returns the login action to redirect to.
+ * Triggers the logout() method of all the authenticate objects, so they can perform
+ * custom logout logic. AuthComponent will remove the session data, so
+ * there is no need to do that in an authentication object.
*
* @param mixed $url Optional URL to redirect the user to after logout
* @return string AuthComponent::$loginAction
@@ -524,6 +527,13 @@ public function login($user = null) {
*/
public function logout() {
$this->__setDefaults();
+ if (empty($this->_authenticateObjects)) {
+ $this->constructAuthenticate();
+ }
+ $user = $this->user();
+ foreach ($this->_authenticateObjects as $auth) {
+ $auth->logout($user);
+ }
$this->Session->delete(self::$sessionKey);
$this->Session->delete('Auth.redirect');
return Router::normalize($this->logoutRedirect);
@@ -1061,6 +1061,17 @@ public function testLogout() {
$this->assertNull($this->Auth->Session->read('Auth.redirect'));
}
+ public function testLogoutTrigger() {
+ $this->getMock('BaseAuthenticate', array('authenticate', 'logout'), array(), 'LogoutTriggerMockAuthenticate', false);
+
+ $this->Auth->authenticate = array('LogoutTriggerMock');
+ $mock = $this->Auth->constructAuthenticate();
+ $mock[0]->expects($this->once())
+ ->method('logout');
+
+ $this->Auth->logout();
+ }
+
/**
* test mapActions loading and delegating to authorize objects.
*

0 comments on commit 71933f5

Please sign in to comment.