首页 文章

更改Laravel 5.4密码加密和表列名称

提问于
浏览
3

我试图将laravel 5.4中的auth集成到现有数据库中,其中用户和密码字段具有其他名称( memberidpasswordnew_enc ) . 随着波纹管的变化并迫使 RegisterController 中的 create 功能使用MD5,我设法使注册工作 . 注册后它也会正常登录 . 但是实际的登录表单返回:

这些凭据与我们的记录不符 .

到目前为止我已经改变了 User.php

public function getAuthPassword()
{
    return $this->passwordnew_enc;
}

public function setPasswordAttribute($value)
{
    $this->attributes['password'] = md5($value);
}

同样在 LoginController.php

public function username()
{
    return 'memberid';
}

我错过了什么 ?

我只需要更改两个列名称以适应密码加密从bcrypt到md5

3 回答

  • 12

    我会自定义用户提供程序 php artisan make:provider CustomUserProvider

    <?php
    
    namespace App\Providers;
    
    use Illuminate\Auth\EloquentUserProvider;
    use Illuminate\Contracts\Auth\Authenticatable as UserContract;
    
    class CustomUserProvider extends EloquentUserProvider {
    
        /**
        * Validate a user against the given credentials.
        *
        * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
        * @param  array  $credentials
        * @return bool
        */
        public function validateCredentials(UserContract $user, array $credentials)
        {
            $plain = $credentials['password']; // will depend on the name of the input on the login form
            $hashedValue = $user->getAuthPassword();
    
            if ($this->hasher->needsRehash($hashedValue) && $hashedValue === md5($plain)) {
                $user->passwordnew_enc = bcrypt($plain);
                $user->save();
            }
    
            return $this->hasher->check($plain, $user->getAuthPassword());
        }
    
    }
    

    这样,如果使用md5存在密码,它将允许它工作一次然后重新散列它 .


    您将在 App\Providers\AuthServiceProvider boot() 中注册 CustomUserProvider ,如下所示:

    $this->app['auth']->provider('custom', function ($app, array $config) {
                $model = $app['config']['auth.providers.users.model'];
                return new CustomUserProvider($app['hash'], $model);
            });
    

    编辑你的 config/auth.php

    'providers' => [
            'users' => [
                'driver' => 'custom',
                'model' => App\User::class,
            ],
    ],
    

    如前所述,您还需要添加以下内容...

    app\Http\Controllers\Auth\LoginController.php
    
    public function username()
    {
        return 'memberid';
    }
    

    app\User.php
    
    public function getAuthIdentifierName()
    {
        return 'memberid';
    }
    
    public function getAuthIdentifier()
    {
        return $this->memberid;
    }
    
    public function getAuthPassword()
    {
        return $this->passwordnew_enc;
    }
    
  • 2

    好吧,我明白了

    app\User.php

    public function setPasswordAttribute($value)
    {
        $this->attributes['password'] = md5($value);
    }
    
    public function getAuthPassword()
    {
        return $this->passwordnew_enc;
    }
    
    public function getAuthIdentifierName()
    {
        return 'memberid';
    }
    

    app\Http\Controllers\Auth\LoginController.php

    public function username()
    {
        return 'memb___id';
    }
    

    config\app.php

    // Illuminate\Hashing\HashServiceProvider::class,
        App\Providers\MD5HashServiceProvider::class,
    

    app\Providers\MD5HashServiceProvider.php

    <?php namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    
    class MD5HashServiceProvider extends ServiceProvider
    {
        /**
         * Indicates if loading of the provider is deferred.
         *
         * @var bool
         */
        protected $defer = true;
        /**
         * Register the service provider.
         *
         * @return void
         */
        public function register()
        {
            $this->app->singleton('hash', function () {
                return new \MD5Hasher;
            });
        }
        /**
         * Get the services provided by the provider.
         *
         * @return array
         */
        public function provides()
        {
            return ['hash'];
        }
    }
    

    lib\MD5Hasher\MD5Hasher.php

    <?php
    class MD5Hasher implements Illuminate\Contracts\Hashing\Hasher
    {
        /**
         * Hash the given value.
         *
         * @param  string  $value
         * @return array   $options
         * @return string
         */
        public function make($value, array $options = array())
        {
            return md5($value); //hash('md5', $value);
        }
        /**
         * Check the given plain value against a hash.
         *
         * @param  string  $value
         * @param  string  $hashedValue
         * @param  array   $options
         * @return bool
         */
        public function check($value, $hashedValue, array $options = array())
        {
            return $this->make($value) === $hashedValue;
        }
        /**
         * Check if the given hash has been hashed using the given options.
         *
         * @param  string  $hashedValue
         * @param  array   $options
         * @return bool
         */
        public function needsRehash($hashedValue, array $options = array())
        {
            return false;
        }
    }
    

    composer.json

    ...
    "autoload": {
        "classmap": [
            ...
            "app/Lib"
        ],
     ...
    
  • 1

    upful的代码对我有用(在Laravel 5.4中)

    但我需要补充一下:

    use Illuminate\Contracts\Auth\Authenticatable as UserContract;
    

    CustomUserProvider 班 .

相关问题