11

Laravel 認証を使用する場合、データベースのパスワード フィールドを変更したいと考えています。usersテーブルの列にname があり、 がpasswdありませんpassword。私はこのようなものを実行しようとしました:

Auth::attempt(array(
    'user_name' => 'admin',
    'passwd' => 'hardpass',
));

しかし、うまくいきません。

Userまた、次の関数をモデルに追加しようとしました:

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

しかし、それはまた何も変わりません。ユーザーはまだ認証されていません。Laravelでデータベースのパスワードフィールド名を変更することは可能ですか?

4

1 に答える 1

56

情報

データベース内の他のすべてのフィールドを簡単に変更して、認証に使用できます。唯一の問題はpasswordフィールドです。

実際password、フィールドは Laravel で何らかの方法でハードコーディングされているため (ただし、多くの人が考える方法ではありません)、質問で渡したように配列を渡すことはできません。

デフォルトでは、次のようにすると、配列(およびおそらくor などattemptの他の Auth 関数) を渡す場合:validateonce

Auth::attempt(array(
    'user_name' => 'admin',
    'password' => 'hardpass',
));

デフォルトの Eloquent ドライバーは、次のクエリを実行します。

select * from `users` where `user_name` = 'admin' limit 1;

データベースからこのデータを取得した後、指定したパスワードと、作成されたユーザー オブジェクトのパスワード プロパティを比較します。

しかし、単に使用する場合:

Auth::attempt(array(
    'user_name' => 'admin',
    'passwd' => 'hardpass',
));

次のクエリが実行されます。

select * from `users` where `user_name` = 'admin' and `passwd` = 'hardpass' limit 1;

データベースにユーザーが見つかりません(passwdハッシュされたパスワードを保存します)。これは、Eloquent がクエリから削除しますpasswordが、他のデータを使用してクエリを実行するためです。また、ここで使用しようとすると'passwd' => Hash:make($data['password'])、ユーザーは見つかりますが、パスワードの比較は機能しません。

解決

解決策は非常に簡単です。Auth::attempt次のように実行する必要があります。

Auth::attempt(array(
    'user_name' => 'admin',
    'password' => 'hardpass',
));

passwordご覧のとおり、(この列はテーブルに存在しませんが) キーとして渡しusersます。これは、Eloquent ドライバーがクエリの作成に使用しないためです。

Userモデル ( app/models/User.php) ファイルに、次の関数を追加する必要があります。

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

ご覧のとおり、ここではデータベースに実際に存在する列を使用しています: passwd.

このように使用すると、任意の名前のパスワードを持つ列を作成でき、デフォルトの Eloquent ドライバーを引き続き使用できます。

テストするサンプルデータ

非常に簡単なテストを作成しました。

app/routes.phpファイルを次のものに置き換えるだけです。

Route::get('/', function () {

    if (Auth::check()) {
        echo "I'm logged in as " . Auth::user()->user_name . "<br />";
        echo "<a href='/logout'>Log out</a>";
    } else {
        echo "I'm NOT logged in<br />";


        Auth::attempt(array(
            'user_name' => 'admin',
            'password'  => 'hardpass',
        ));


        if (Auth::check()) {
            echo "Now I'm logged in as " . Auth::user()->user_name . "<br />";
            echo "<a href='/logout'>Log out</a>";
        } else {
            echo "I'm still NOT logged in<br />";
        }
    }


});

Route::get('/logout', function () {
    Auth::logout();
    return "You have been logged out";
});


Route::get('/db', function () {

    if (!Schema::hasTable('users')) {


        Schema::create('users', function ($table) {
            $table->engine = 'InnoDB';
            $table->increments('id');
            $table->string('user_name', 60)->unique();
            $table->string('passwd', 256);
            $table->rememberToken();
            $table->timestamps();
        });

        DB::table('users')->insert(
            [
                [
                    'user_name' => 'admin',
                    'passwd'    => Hash::make('hardpass'),
                ]
            ]
        );
    }

    echo "Table users has been created";
});
  1. 空のデータベースを作成し、接続データを設定しますapp/config/database.php
  2. たとえば、users テーブルを作成するためだけに/dburl を実行できます。http://localhost/yourprojectname/db
  3. /たとえば、urlを実行できます-データベースのテーブルに列がないhttp://localhost/yourprojectname/場合でもユーザーがログインしていることがわかります(認証用のデータはフォームなしで文字列として渡されますが、もちろん実際のアプリケーションではそれらを追加します)。この URL をもう一度実行できます。ユーザーがまだログに記録されているため、期待どおりに機能しています。userspassword
  4. リンクをクリックLog outするとログアウトされます

上記のLaravel 5の変更

このソリューションは、Larave 4.2.9 (上記のすべて) および Laravel 5 でもテストされました。Laravel5 では、すべて同じように機能しますが、もちろん異なるパスのファイルを編集する必要があります。

  1. Userモデルはapp/User.phpファイルにあります
  2. ルートはapp/Http/routes.phpファイルにあります
  3. データベース構成ファイルはファイルにありconfig/database.phpます
于 2014-09-27T09:41:23.890 に答える