Skip to content

Commit

Permalink
Adding a logout callback to authenticate objects.
Browse files Browse the repository at this point in the history
Adding tests for the callback.
Adding doc blocks for the new callback.
Fixes #1758
  • Loading branch information
markstory committed Jul 3, 2011
1 parent be09c67 commit 71933f5
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 1 deletion.
14 changes: 13 additions & 1 deletion lib/Cake/Controller/Component/Auth/BaseAuthenticate.php
Expand Up @@ -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.
Expand All @@ -108,4 +120,4 @@ abstract public function authenticate(CakeRequest $request, CakeResponse $respon
public function getUser($request) {
return false;
}
}
}
10 changes: 10 additions & 0 deletions lib/Cake/Controller/Component/AuthComponent.php
Expand Up @@ -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
Expand All @@ -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);
Expand Down
11 changes: 11 additions & 0 deletions lib/Cake/Test/Case/Controller/Component/AuthComponentTest.php
Expand Up @@ -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.
*
Expand Down

0 comments on commit 71933f5

Please sign in to comment.