2014-09-27 41 views
10

Tôi muốn thay đổi trường mật khẩu trong cơ sở dữ liệu khi sử dụng xác thực Laravel. Tôi muốn cột của tôi ở users bảng có tên passwd và không phải là password. Tôi đã cố gắng chạy một cái gì đó như thế này:Cách thay đổi/Tên trường mật khẩu tùy chỉnh cho Laravel 4 và xác thực người dùng Laravel 5

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

nhưng nó không hoạt động.

Tôi cũng cố gắng thêm trong User mô hình chức năng sau:

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

nhưng nó cũng thay đổi gì cả. Người dùng vẫn chưa được xác thực. Có thể trong Laravel để thay đổi tên trường mật khẩu trong cơ sở dữ liệu không?

+0

@JarekTkaczyk Đó là sự thật, nhưng không có thông tin đó cho người dùng muốn có cột mật khẩu tùy chỉnh trong cơ sở dữ liệu. OP đã đề cập chỉ sử dụng 'getAuthPassword' nhưng đối với người dùng đang tìm kiếm giải pháp, anh ta vẫn sẽ không biết phải làm gì. Tôi nghĩ câu Hỏi & Đáp này sẽ hữu ích cho những người dùng khác để giải quyết vấn đề này theo từng bước –

+1

Chỉ cần một gợi ý - hầu hết thời gian các câu trả lời có giá trị nhất là những câu hỏi ngắn và chính xác, giải quyết chính xác vấn đề. –

+0

@ MarcinNabiałek bạn đã cứu mạng sống của tôi trong lĩnh vực tùy chỉnh ngu ngốc này trong dự án của tôi đã giúp tôi lái chuối – caro

Trả lời

45

Thông tin

Bạn có thể thay đổi dễ dàng tất cả các trường khác trong cơ sở dữ liệu và sử dụng chúng để xác thực. Vấn đề duy nhất là với trường password.

Trong thực tế, một số cách được mã hóa cứng trong Laravel (nhưng không phải cách mà nhiều người nghĩ) để bạn không thể truyền mảng khi bạn chuyển câu hỏi của bạn.

Theo mặc định nếu bạn vượt qua mảng để attempt (và có lẽ chức năng Auth khác như validate hoặc once) nếu bạn làm điều đó theo cách này:

tài xế hùng biện
Auth::attempt(array(
    'user_name' => 'admin', 
    'password' => 'hardpass', 
)); 

mặc định sẽ chạy truy vấn sau đây:

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

Sau khi nhận dữ liệu này từ cơ sở dữ liệu, nó sẽ so sánh mật khẩu bạn đã cung cấp với thuộc tính mật khẩu cho đối tượng Người dùng đã được tạo.

Nhưng nếu bạn chỉ cần sử dụng:

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

các truy vấn sau đây sẽ được chạy:

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

và không sử dụng sẽ được tìm thấy trong cơ sở dữ liệu (trong passwd bạn lưu trữ mật khẩu băm). Điều này là do Eloquent loại bỏ khỏi truy vấn password nhưng sử dụng bất kỳ dữ liệu nào khác để chạy truy vấn. Ngoài ra nếu bạn dùng thử tại đây để sử dụng 'passwd' => Hash:make($data['password']) mặc dù người dùng sẽ được tìm thấy, việc so sánh mật khẩu sẽ không hoạt động.

Giải pháp

Giải pháp khá dễ dàng. Bạn cần phải chạy Auth::attempt như thế này:

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

Như bạn thấy bạn vẫn vượt qua password như chìa khóa (mặc dù cột này không lối thoát trong users bảng) bởi vì chỉ có cách này tài xế hùng biện sẽ không sử dụng nó để xây dựng truy vấn .

Bây giờ trong User mô hình (app/models/User.php) nộp bạn cần phải thêm các chức năng sau:

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

Như bạn thấy bạn sử dụng ở đây là cột đó thực sự tồn tại trong cơ sở dữ liệu: passwd.

Sử dụng theo cách này bạn có thể có cột có mật khẩu có tên bất kỳ thứ gì bạn muốn và bạn vẫn có thể sử dụng trình điều khiển Eloquent mặc định cho nó.

Dữ liệu mẫu để kiểm tra

Tôi đã tạo thử nghiệm rất đơn giản cho nó.

Bạn chỉ cần thay thế tập tin app/routes.php của bạn như sau:

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. Tạo cơ sở dữ liệu rỗng và kết nối dữ liệu đặt trong app/config/database.php
  2. Bây giờ bạn có thể chạy /db url ví dụ http://localhost/yourprojectname/db chỉ để tạo người dùng bàn.
  3. Bây giờ bạn có thể chạy / url ví dụ http://localhost/yourprojectname/ - khi bạn thấy người dùng được đăng nhập ngay cả khi trong users bảng trong cơ sở dữ liệu mà bạn không có bất kỳ cột nào password (dữ liệu để xác thực đã được chuyển thành chuỗi không có bất kỳ biểu mẫu nào) trong ứng dụng thực tế, bạn sẽ thêm chúng). Bạn có thể chạy url này một lần nữa - khi bạn thấy người dùng vẫn đang đăng nhập để nó hoạt động như mong đợi.
  4. Nếu bạn bấm vào Log out liên kết, bạn sẽ được đăng xuất khỏi

5 thay đổi cho trên

Giải pháp này đã được thử nghiệm trong Larave 4.2.9 (tất cả mọi thứ như trên) và cũng trong Laravel 5 Laravel. trong Laravel5 mọi thứ hoạt động giống nhau nhưng bạn cần phải chỉnh sửa các file nhiên trong con đường khác nhau:

  1. User mô hình là trong app/User.php tập tin
  2. đường bay trong app/Http/routes.php tập tin
  3. tập tin cơ sở dữ liệu cấu hình là trong config/database.php tập tin
Các vấn đề liên quan