2016-02-29 3 views
6

私はLaravel 5.2でログイン機能を実装する必要があります。私は、公式のLaravalのドキュメントを使用して成功裏に完了しました。ただし、別のデータベーステーブルのカラム名、つまりst_usernamest_passwordを使用してユーザを認証する方法がわかりません。Laravel 5.2で異なるデータベーステーブルの列名でログインするにはどうすればよいですか?

私は手がかりを求めてインターネットを検索しましたが、無駄です。 Authにはどのクラスを使用する必要があるのか​​わかりません(Illuminate .......など)。誰かが答えを知っているなら、私に知らせてください。ここで

は私のコードは次のとおりです。

ログインビュー

@extends('layouts.app') 
@section('content') 

<div class="contact-bg2"> 
    <div class="container"> 
     <div class="booking"> 
      <h3>Login</h3> 
      <div class="col-md-4 booking-form" style="margin: 0 33%;"> 
       <form method="post" action="{{ url('/login') }}"> 
        {!! csrf_field() !!} 

        <h5>USERNAME</h5> 
        <input type="text" name="username" value="abcuser"> 
        <h5>PASSWORD</h5> 
        <input type="password" name="password" value="abcpass"> 

        <input type="submit" value="Login"> 
        <input type="reset" value="Reset"> 
       </form> 
      </div> 
     </div> 
    </div> 

</div> 
<div></div> 


@endsection 

AuthController

namespace App\Http\Controllers\Auth; 

use App\User; 
use Validator; 
use App\Http\Controllers\Controller; 
use Illuminate\Foundation\Auth\ThrottlesLogins; 
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers; 

class AuthController extends Controller 
{ 
    use AuthenticatesAndRegistersUsers, ThrottlesLogins; 

    protected $redirectTo = '/home'; 

    public function __construct() 
    { 
     $this->middleware('guest', ['except' => 'logout']); 
     $this->username = 'st_username'; 
     $this->password = 'st_password'; 
    } 

    protected function validator(array $data) 
    { 
     return Validator::make($data, [ 
        'name' => 'required|max:255', 
        'email' => 'required|email|max:255|unique:users', 
        'password' => 'required|confirmed|min:6', 
     ]); 
    } 

ルートが

Route::get('/', function() { 
    return view('index'); 
}); 

Route::group(['middleware' => 'web'], function() { 
    Route::auth(); 

    Route::get('/home', '[email protected]'); 
}); 

のconfig/auth.php

ファイル
return [ 
    'defaults' => [ 
     'guard' => 'web', 
     'passwords' => 'users', 
    ], 
    'guards' => [ 
     'web' => [ 
      'driver' => 'session', 
      'provider' => 'users', 
     ], 
     'api' => [ 
      'driver' => 'token', 
      'provider' => 'users', 
     ], 
    ], 
    'providers' => [ 
     'users' => [ 
      'driver' => 'eloquent', 
      'model' => App\User::class, 
     ], 
//  'users' => [ 
//   'driver' => 'database', 
//   'table' => 'users', 
//  ], 
    ], 
    'passwords' => [ 
     'users' => [ 
      'provider' => 'users', 
      'email' => 'auth.emails.password', 
      'table' => 'password_resets', 
      'expire' => 60, 
     ], 
    ], 
]; 

答えて

3
でこれらの設定を見つけることができます私はカスタマイズする方法をたくさん探しました Laravel 5.2承認フォームとこれは私のために働いている100%です。 ここからは、下から上の解決策があります。

このソリューションはここ出身:https://laracasts.com/discuss/channels/laravel/replacing-the-laravel-authentication-with-a-custom-authentication

が、私はそれを動作させるためにカップルの変更をしなければなりませんでした。

私のカスタムの列名が 'dj_' であるように、私のウェブアプリは、たとえば名前が/ configにdj_name

  1. のconfig/auth.php

    // change this 
    'driver' => 'eloquent', 
    // to this 
    'driver' => 'custom', 
    
  2. で、DJのためのものですapp.php ...リスト にカスタムプロバイダを追加

    ​​
  3. フォルダアプリの\プロバイダ内CustomAuthProvider.phpを作成

    namespace App\Providers; 
    
    use Illuminate\Support\Facades\Auth; 
    
    use App\Providers\CustomUserProvider; 
    use Illuminate\Support\ServiceProvider; 
    
    class CustomAuthProvider extends ServiceProvider { 
    
        /** 
        * Bootstrap the application services. 
        * 
        * @return void 
        */ 
        public function boot() 
        { 
         Auth::provider('custom', function($app, array $config) { 
         // Return an instance of    Illuminate\Contracts\Auth\UserProvider... 
         return new CustomUserProvider($app['custom.connection']); 
         }); 
        } 
    
        /** 
        * Register the application services. 
        * 
        * @return void 
        */ 
        public function register() 
        { 
         // 
        } 
    } 
    
  4. CustomUserProviderを作成します。アプリケーション/ HTTP /コントローラ/認証/ AuthController.phpのフォルダアプリの\プロバイダの内部にもPHP

    <?php 
    
    namespace App\Providers; 
    use App\User; use Carbon\Carbon; 
    use Illuminate\Auth\GenericUser; 
    use Illuminate\Contracts\Auth\Authenticatable; 
    use Illuminate\Contracts\Auth\UserProvider; 
    use Illuminate\Support\Facades\Hash; 
    use Illuminate\Support\Facades\Log; 
    
    class CustomUserProvider implements UserProvider { 
    
    /** 
    * Retrieve a user by their unique identifier. 
    * 
    * @param mixed $identifier 
    * @return \Illuminate\Contracts\Auth\Authenticatable|null 
    */ 
    public function retrieveById($identifier) 
    { 
        // TODO: Implement retrieveById() method. 
    
    
        $qry = User::where('dj_id','=',$identifier); 
    
        if($qry->count() >0) 
        { 
         $user = $qry->select('dj_id', 'dj_name', 'first_name', 'last_name', 'email', 'password')->first(); 
    
         $attributes = array(
          'id' => $user->dj_id, 
          'dj_name' => $user->dj_name, 
          'password' => $user->password, 
          'email' => $user->email, 
          'name' => $user->first_name . ' ' . $user->last_name, 
         ); 
    
         return $user; 
        } 
        return null; 
    } 
    
    /** 
    * Retrieve a user by by their unique identifier and "remember me" token. 
    * 
    * @param mixed $identifier 
    * @param string $token 
    * @return \Illuminate\Contracts\Auth\Authenticatable|null 
    */ 
    public function retrieveByToken($identifier, $token) 
    { 
        // TODO: Implement retrieveByToken() method. 
        $qry = User::where('dj_id','=',$identifier)->where('remember_token','=',$token); 
    
        if($qry->count() >0) 
        { 
         $user = $qry->select('dj_id', 'dj_name', 'first_name', 'last_name', 'email', 'password')->first(); 
    
         $attributes = array(
          'id' => $user->dj_id, 
          'dj_name' => $user->dj_name, 
          'password' => $user->password, 
          'email' => $user->email, 
          'name' => $user->first_name . ' ' . $user->last_name, 
         ); 
    
         return $user; 
        } 
        return null; 
    
    
    
    } 
    
    /** 
    * Update the "remember me" token for the given user in storage. 
    * 
    * @param \Illuminate\Contracts\Auth\Authenticatable $user 
    * @param string $token 
    * @return void 
    */ 
    public function updateRememberToken(Authenticatable $user, $token) 
    { 
        // TODO: Implement updateRememberToken() method. 
        $user->setRememberToken($token); 
    
        $user->save(); 
    
    } 
    
    /** 
    * Retrieve a user by the given credentials. 
    * 
    * @param array $credentials 
    * @return \Illuminate\Contracts\Auth\Authenticatable|null 
    */ 
    public function retrieveByCredentials(array $credentials) 
    { 
    
        // TODO: Implement retrieveByCredentials() method. 
        $qry = User::where('email','=',$credentials['email']); 
    
        if($qry->count() > 0) 
        { 
         $user = $qry->select('dj_id','dj_name','email','password')->first(); 
    
    
         return $user; 
        } 
    
        return null; 
    
    
    } 
    
    /** 
    * Validate a user against the given credentials. 
    * 
    * @param \Illuminate\Contracts\Auth\Authenticatable $user 
    * @param array $credentials 
    * @return bool 
    */ 
    public function validateCredentials(Authenticatable $user, array $credentials) 
    { 
        // TODO: Implement validateCredentials() method. 
        // we'll assume if a user was retrieved, it's good 
    
        // DIFFERENT THAN ORIGINAL ANSWER 
        if($user->email == $credentials['email'] && Hash::check($credentials['password'], $user->getAuthPassword()))//$user->getAuthPassword() == md5($credentials['password'].\Config::get('constants.SALT'))) 
        { 
    
    
         //$user->last_login_time = Carbon::now(); 
         $user->save(); 
    
         return true; 
        } 
        return false; 
    
    
    } 
    } 
    
  5. 「dj_name」にすべて 「名前」を変更し、あなたがそれらを持っている場合は、カスタムフィールドを追加...あなたはまた

    を照らし\財団\認証\ User.phpで
  6. アプリ/ User.phpチェンジ「dj_name」から「名前」は

    protected $table = 'djs'; 
    protected $primaryKey = 'dj_id'; 
    
  7. を追加するには、電子メールの列名に「メール」を変更することができますし、カスタムフィールドを追加します。カスタム列名に「パスワード」列を変更するための は今、バックエンドが全て行われているので、あなただけのレイアウトのlogin.blade.php、register.blade.php、app.bladeを変更する必要が

    public function getAuthPassword(){ 
        return $this->custom_password_column_name; 
    } 
    
  8. を追加します。 php ...ここでは、 '名前'を 'dj_name'、電子メール、またはカスタムフィールドに変更するだけです。 !!!パスワード欄に名前付きパスワードを残す必要があります!またまた

、一意の電子メールの検証の変更を行うためAuthController.php

'custom_email_field' => 'required|email|max:255|unique:users', 
to 
'custom_email_field' => 'required|email|max:255|unique:custom_table_name', 

、あなたはupdated_atのフィールドが点灯\データベースでグローバル変数を変更するのcreated_atカスタムを作りたい場合は、\雄弁\モデル。 PHP

const CREATED_AT = 'dj_created_at'; 
const UPDATED_AT = 'dj_updated_at'; 
2

これは単に認証に必要なカラム名を使用する::ので、同様の試み()/メソッドは簡単です:

if (Auth::attempt(['st_username' =>$username,'st_password' => $password])) { 
    // Authentication passed... 
    return redirect()>intended('dashboard'); 
} 

更新: あなたもデフォルトの認証テーブルを変更したい場合デフォルトでusersまたはデフォルトでモデル名やパスApp\Userを変更するには、config\auth.php

/* 
|-------------------------------------------------------------------------- 
| Authentication Table 
|-------------------------------------------------------------------------- 
| 
| When using the "Database" authentication driver, we need to know which 
| table should be used to retrieve your users. We have chosen a basic 
| default value but you may easily change it to any table you like. 
| 
*/ 

//'table' => 'users', 
'table' => 'new_tables_for_authentication', 



/* 
|-------------------------------------------------------------------------- 
| Authentication Model 
|-------------------------------------------------------------------------- 
| 
| When using the "Eloquent" authentication driver, we need to know which 
| Eloquent model should be used to retrieve your users. Of course, it 
| is often just the "User" model but you may use whatever you like. 
| 
*/ 

//'model' => App\User::class, 
'model' => App\Models\User::class, 
+0

解決策を実装する際にこのエラーが発生しました。 'EloquentUserProvider.php行のFatalErrorException 126:クラス '\ App \ User'が見つかりませんでした。 ' –

+0

エラーは私の解決策ではありません。あなたのユーザーモデルはどこにありますか?ユーザーのために別のテーブルを使用していますか? – Digitlimit

+0

私はそれがあなたの解決策ではないことを知っています。私はちょうど助けを求めています。エラーの原因は、 'app/Models/User.php'にある' User.php'の位置です。だから私は 'app/User.php'に変更しました。しかし、まだ問題は 'EloquentUserProvider.php行113のErrorException:未定義インデックス:パスワード'として発生します。 –

2

カスタム認証::試みは()のようauth.phpにモデルを変更することによって、私のために動作しません。

'providers' => [ 
    'users' => [ 
     'driver' => 'eloquent', 
     'model' => App\Person::class, 
    ], 
], 

私は認証::試みで、カスタムの列名を経由して個人認証をしようとした場合:

if (Auth::attempt(['persUsername' => $request->user, 'persPassword' => $request->pass])) { 
    return redirect()->intended('/'); 
} 

私は同じエラーを取得:

ErrorException in EloquentUserProvider.php line 112: Undefined index: password

をしかし、私のような人を認証することができますこれは:

$person = Person 
    ::where('persUsername', $request->user) 
    ->where('persPassword', $request->pass) 
    ->first(); 

if (! is_null($person)) { 
    if ($person->persUsername === $request->user && $person->persPassword === $request->pass) { 
     Auth::login($person, false); 
     return redirect()->intended('/'); 
    } 
} 

しかし、それは私が推測する方法ではありません。

上記のファイル(EloquentUserProvider.php)には、「パスワード」がハードコードされているのがわかります。

public function retrieveByCredentials(array $credentials) 
{ 
    $query = $this->createModel()->newQuery(); 

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

    return $query->first(); 
} 

public function validateCredentials(UserContract $user, array $credentials) 
{ 
    $plain = $credentials['password']; 

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

実際にパスワードにカスタム列名を使用する簡単な方法はありません。

関連する問題