Skip to content

Commit

Permalink
Extracting the password hashing builder to a factory object
Browse files Browse the repository at this point in the history
  • Loading branch information
lorenzo committed Jun 3, 2014
1 parent 0d2362a commit cf52733
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 23 deletions.
26 changes: 3 additions & 23 deletions src/Controller/Component/Auth/BaseAuthenticate.php
Expand Up @@ -14,7 +14,7 @@
namespace Cake\Controller\Component\Auth;

use Cake\Controller\ComponentRegistry;
use Cake\Controller\Component\Auth\AbstractPasswordHasher;
use Cake\Controller\Component\Auth\PasswordHasherFactory;
use Cake\Core\App;
use Cake\Core\InstanceConfigTrait;
use Cake\Error;
Expand Down Expand Up @@ -135,7 +135,7 @@ protected function _findUser($username, $password = null) {
* Return password hasher object
*
* @return AbstractPasswordHasher Password hasher instance
* @throws \Cake\Error\Exception If password hasher class not found or
* @throws RuntimeException If password hasher class not found or
* it does not extend AbstractPasswordHasher
*/
public function passwordHasher() {
Expand All @@ -144,27 +144,7 @@ public function passwordHasher() {
}

$passwordHasher = $this->_config['passwordHasher'];

$config = array();
if (is_string($passwordHasher)) {
$class = $passwordHasher;
} else {
$class = $passwordHasher['className'];
$config = $passwordHasher;
unset($config['className']);
}

list($plugin, $class) = pluginSplit($class, true);
$className = App::className($class, 'Controller/Component/Auth', 'PasswordHasher');
if (!class_exists($className)) {
throw new Error\Exception(sprintf('Password hasher class "%s" was not found.', $class));
}

$this->_passwordHasher = new $className($config);
if (!($this->_passwordHasher instanceof AbstractPasswordHasher)) {
throw new Error\Exception('Password hasher must extend AbstractPasswordHasher class.');
}
return $this->_passwordHasher;
return $this->_passwordHasher = PasswordHasherFactory::build($passwordHasher);
}

/**
Expand Down
58 changes: 58 additions & 0 deletions src/Controller/Component/Auth/PasswordHasherFactory.php
@@ -0,0 +1,58 @@
<?php
/**
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @since 3.0
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Controller\Component\Auth;

use Cake\Core\App;

/**
* Builds password hashing objects
*
*/
class PasswordHasherFactory {

/**
* Return password hasher object out of a hasher name or a configuration array
*
* @param string|array $passwordHasher name of the password hasher or an array with
* at least the key `className` set to the name of the class to use
* @return AbstractPasswordHasher Password hasher instance
* @throws RuntimeException If password hasher class not found or
* it does not extend AbstractPasswordHasher
*/
public static function build($passwordHasher) {
$config = [];
if (is_string($passwordHasher)) {
$class = $passwordHasher;
} else {
$class = $passwordHasher['className'];
$config = $passwordHasher;
unset($config['className']);
}

list($plugin, $class) = pluginSplit($class, true);
$className = App::className($class, 'Controller/Component/Auth', 'PasswordHasher');
if (!class_exists($className)) {
throw new Error\Exception(sprintf('Password hasher class "%s" was not found.', $class));
}

$hasher = new $className($config);
if (!($hasher instanceof AbstractPasswordHasher)) {
throw new \RuntimeException('Password hasher must extend AbstractPasswordHasher class.');
}

return $hasher;
}

}

0 comments on commit cf52733

Please sign in to comment.