在Laravel 4中实现命名空间的hasher

时间:2014-03-11 10:58:39

标签: php hash laravel-4 autoloader

我想在this post之后在Laravel 4(这里是Whirlpool,但我的问题不是Hash相关)中实现另一个hasher。

我的项目的不同之处在于我在文件夹和命名空间中创建了我的服务:

Laravel
|-- app
|   |-- config
|   |   +-- app.php
|   |
|   |-- controllers
|   |   +-- UserController.php
|
|-- lib
|   +-- Max13
|       +-- Services
|           +-- Hash
|               |-- WhirlpoolHasher.php
|               +-- WhirlpooHashServiceProvider.php
|
|-- start
|   +-- global.php
|
+-- composer.json

以下是每个文件的相关摘录:

composer.json:

[...]
"autoload": {
    "classmap": [
        [...]
        "app/lib",
    ]
}
[...]

应用/配置/ app.php:

<?php
return array(
[...]
    'providers' => array(
        [...]
        'Illuminate\Workbench\WorkbenchServiceProvider',
        'Max13\Services\Hash\WhirlpoolHashServiceProvider',
    ),
[...]
);

应用/控制器/ UserControllers.php:

<?php
class UserController extends BaseController
{
    /**
     * Treat GET methods.
     *
     * @return Response
     */
    public function getUser()
    {
        if (Input::has('username', 'password')) {
            $username = Input::get('username');
            $password = Hash::make(Input::get('password'));

            Response::json($password);
        } else {
            return 'unknown';
        }
    }
}

LIB / Max13 /服务/散列/ WhirlpoolHasher.php:

<?php namespace Max13\Services\Hash;

class WhirlpoolHasher implements \Illuminate\Hashing\HasherInterface
{
    public function make($value, array $options = array())
    {
        $hash = hash('whirlpool', $value);

        if ($hash === null) {
            throw new \RuntimeException("Wirlpool hashing not supported.");
        }

        return $hash;
    }

    public function check($value, $hashedValue, array $options = array())
    {
        return strcasecmp($this->make($value), $hashedValue) === 0;
    }

    public function needsRehash($hashedValue, array $options = array())
    {
        return ctype_alnum($hashedValue) && strlen($hashedValue) === 128;
    }
}

LIB / Max13 /服务/散列/ WhirlpoolHashServiceProvider.php:

<?php namespace Max13\Services\Hash;

class WhirlpoolHashServiceProvider extends \Illuminate\Support\ServiceProvider
{
    public function register()
    {
        $this->app['hash'] = $this->app->share(function () {
            return new WhirlpoolHasher();
        });
    }

    public function provides()
    {
        return array('hash');
    }
}

我认为我已经完成了所有事情(我没有忘记php composer dump-autoload),我没有任何错误但是当我在/user?username=foo&password=bar查询我的网站时,我得到了{{1} hash(60个字符,Bcrypt是128)。有谁知道我错过了什么?

2 个答案:

答案 0 :(得分:1)

从config / app.php中删除laravel的默认'Illuminate\Hashing\HashServiceProvider',提供程序(第93行),你应该很高兴。

答案 1 :(得分:0)

我试图实现自己的哈希,我会说你的描述是很好的指导。不幸的是我花了很多时间

'Class 'FooHasherServiceProvider' not found'
'Call to undefined method Illuminate\Support\Facades\Hash::check()'

并且无法弄明白。因此,对于将来解决问题的人,必须运行

composer dump-autoload
编辑classmap中的composer.json