9

データベースにユーザーのテーブルがあります。それらのパスワードは、私自身のカスタムハッシュ関数で生成されます。

自分のハッシュクラスを使用するためにlaravel4の認証メソッドをオーバーライドするにはどうすればよいですか?

これは私がやろうとしてきたことです:

    class CustomUserProvider implements Illuminate\Auth\UserProviderInterface {


    public function retrieveByID($identifier)
    {
        return $this->createModel()->newQuery()->find($identifier);
    }

    public function retrieveByCredentials(array $credentials)
    {
        // First we will add each credential element to the query as a where clause.
        // Then we can execute the query and, if we found a user, return it in a
        // Eloquent User "model" that will be utilized by the Guard instances.
        $query = $this->createModel()->newQuery();

        foreach ($credentials as $key => $value)
        {
            if ( ! str_contains($key, 'password')) $query->where($key, $value);
        }

        return $query->first();
    }

    public function validateCredentials(Illuminate\Auth\UserInterface $user, array $credentials)
    {
        $plain = $credentials['password'];

        return $this->hasher->check($plain, $user->getAuthPassword());
    }

}

class CodeIgniter extends Illuminate\Auth\Guard {


}

App::bind('Illuminate\Auth\UserProviderInterface', 'CustomUserProvider');



Auth::extend('codeigniter', function()
{
    return new CodeIgniter( App::make('CustomUserProvider'), App::make('session'));
});

Auth ::attemptメソッドを実行すると次のエラーが発生します:ErrorException:警告:G:\ Dropbox \ Workspaces \ www \ video \ vendor \ laravel \ framework \ src \ Illuminate \ Foundation\Applicationのissetまたはemptyの不正なオフセットタイプ.php行352

4

4 に答える 4

15

これは問題を解決する方法です:

libraries\CustomHasherServiceProvider.php

use Illuminate\Support\ServiceProvider;

class CustomHasherServiceProvider extends ServiceProvider {

    public function register()
    {
        $this->app->bind('hash', function()
        {
            return new CustomHasher;
        });
    }

}

libraries\CustomHasher.php

class CustomHasher implements Illuminate\Hashing\HasherInterface {

private $NUMBER_OF_ROUNDS = '$5$rounds=7331$';


public function make($value, array $options = array())
{

    $salt = uniqid();
    $hash = crypt($password, $this->NUMBER_OF_ROUNDS . $salt);
    return substr($hash, 15);
}

public function check($value, $hashedValue, array $options = array())
{
    return $this->NUMBER_OF_ROUNDS . $hashedValue === crypt($value, $this->NUMBER_OF_ROUNDS . $hashedValue);
}

}

そして、app/config/app.php の providers 配列で、「Illuminate\Hashing\HashServiceProvider」を「CustomHasherServiceProvider」に置き換えました。

composer.json でクラスマップを自動ロードする「app/libraries」を追加しました

于 2013-03-09T16:02:43.807 に答える
4

@vFragosop は、拡張によって正しい道を歩んでいましたAuth

猫の皮を剥ぐ方法はいくつかありますが、デフォルトHasherのクラスを置き換えずにそれを行う方法を次に示します。

app/routes.phpあなたのまたはどこにでも含める:

use Illuminate\Auth\Guard;
Auth::extend("eloquent", function() {
    return new Guard(
        new \Illuminate\Auth\EloquentUserProvider(new CustomHasher(), "User"),  
        App::make('session.store')
    );
});

CustomHasherクラス (つまりapp/libraries/CustomHasher.php)を作成してオートロードします。

class CustomHasher extends Illuminate\Hashing\BcryptHasher {
    public function make($value, array $options = array())
    {
        ...
    }
    public function check($value, $hashedValue, array $options = array())
    {
        ...
    }
}

それでおしまい。

于 2013-11-15T17:08:41.327 に答える
1

警告:これが箱から出してすぐに動作することを保証することはできません。Laravel 4 はまだ開発中です。より正確な回答を提供できれば幸いですが、コードベースにはまだ多くの変更が加えられており、すべてが適切に文書化されているわけではありません。とにかく、あなたはこのようなものを探しています:

// on config/auth.php
'driver' => 'custom'
// on start/global.php
Auth::extend('custom', function() {
    // CustomUserProvider is your custom driver and should
    // implement Illuminate\Auth\UserProviderInterface;
    return new Guard(new CustomUserProvider, App::make('session'));
});

これで開始するのに十分な情報が得られない場合は、以下のクラスを見て理解できるはずです。

EloquentUserProviderおよびDatabaseUserProvider
これらのクラスは、現在サポートされている認証ドライバーです。彼らはあなたのCustomUserProvider(またはあなたが本当に好きな名前)を作成する方法を案内するはずです。

Manager
これは、カスタム ドライバーを受け入れるあらゆるものの基本クラスです ( AuthManagerを含む)。Laravel 3 で行うように、それらを登録する方法を提供します。

于 2013-03-09T02:51:42.813 に答える
0

これは Google でのトップの結果でしたが、これらの回答は Laravel 5 の誰にとっても不十分です。ドキュメントでさえ十分ではありません。

UserProvider のみの Hasher を正常に置き換えました。アプリケーションの残りの部分では、引き続き非常に優れた BcryptHasher を使用しますが、ユーザー認証ではカスタム ハッシュを使用します。これを行うには、これらの回答、ドキュメント、および Laravel のソース コード自体を調査する必要がありました。これが私が見つけたものです。うまくいけば、私は他の誰かの頭髪全体を救うことができます. これを Laravel 5 に関する質問に気軽にクロスポストしてください。


まず、カスタム ハッシャーを作成します (まだ作成していない場合)。好きな場所に配置してください。

class MyCustomHasher implements Hasher {

    public function make($value, array $options = []) {
        return md5( $value );  // PLEASE DON'T USE MD5!
    }

    public function check($value, $hashedValue, array $options = []) {
        if (strlen($hashedValue) === 0) {
            return false;
        }
        return $hashedValue === $this->make($value);
    }

    public function needsRehash($hashedValue, array $options = []) {
        return false;
    }

}

次のように登録を編集ServiceProviderします...

class AppServiceProvider extends ServiceProvider {

    public function boot() {
        Auth::provider('eloquentCustom', function ($app, $config) {
            return new EloquentUserProvider(new MyCustomHasher(), $config['model']);
        });
    }

}

好きなものに交換でき'eloquentCustom'ます。


最後に、config/auth.phpカスタム プロバイダーを使用するように を編集します。ここに関連する部分があります...

return [

    // ...

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        // ...
    ],

    // ...

    'providers' => [
        'users' => [
            'driver' => 'eloquentCustom',  // <--- This is the only change
            'model' => App\User::class,
        ],
        // ...
    ],

    // ...

];


これがどれほどあいまいだったか信じられないので、ここで少し説明します。

ご想像のとおり、認証は で構成されconfig/auth.phpます。Guard と Provider という 2 つの重要な部分があります。ガードが何をするのかを正確に学ぶことはまだ気にしていませんが、認証要件を強制しているようです. プロバイダーは、警備員に必要な情報を提供する責任があります。したがって、Guard には Provider が必要です。guards.web.providerデフォルト設定では、 が にマッピングされていることがわかりますproviders.users

Laravel はUserProvider、デフォルトでEloquentUserProviderとの 2 つの実装を提供しますDatabaseUserProvider。これらは、それぞれproviders.users.driver:eloquentとの 2 つの可能な値に対応しdatabaseます。通常、eloquentオプションが選択されます。EloquentUserProviderが必要なHasherので、Laravel は標準実装が何であれそれを提供します (つまり. BcryptHasher)。プロバイダーをインスタンス化するための独自の「ドライバー」を作成することで、この動作をオーバーライドします。

Auth私たちのフレンドリーな近所のファサードです。によって支えられていAuthManagerます。よく提案される方法は、 (ドキュメントが示唆するものとは反対に)をAuth::extend()期待しています。Guard警備員をいじる必要はありません。代わりに、Provider を期待することを除いて、Auth::provider()基本的に と同じことを行う whichを使用できます。extend()そのため、 の独自のインスタンスを作成する関数を提供し、EloquentUserProviderそれにカスタム Hasher (例: MyCustomHasher) を与えます。また、構成ファイルで使用できるドライバーの「名前」も含めます。

設定ファイルに戻ります。作成したばかりのドライバー名は、 の有効な値になりましたproviders.users.driver。そこにセットすれば、準備完了です。

これがすべて理にかなっていて、誰かにとって役立つことを願っています!

于 2019-01-22T01:14:22.850 に答える