web-dev-qa-db-ja.com

Laravel 5.4パスワード暗号化とテーブル列名の変更

ユーザーフィールドとパスワードフィールドが他の名前(memberidpasswordnew_enc)である既存のデータベース内のlaravel5.4に認証を統合しようとしています。以下の変更と、createRegisterController関数に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';
}

私は何か見落としてますか ?

2つの列名を適切に変更し、パスワードの暗号化をbcryptからmd5に変更するだけです。

5
dev

カスタムユーザープロバイダーを_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を使用して存在する場合、パスワードは1回機能し、その後再ハッシュされます。


次のように、CustomUserProviderApp\Providers\AuthServiceProvider boot()に登録します。

_$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;
}
_
20
upful

了解しました

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"
    ],
 ...
4
dev

upfulのコードは私のために働いた(Laravel 5.4)

しかし、私は追加する必要がありました:

use Illuminate\Contracts\Auth\Authenticatable as UserContract;

CustomUserProviderクラス内。

1
TimFelix