2013-07-27 25 views
10

Tôi cần kiểm tra xem người dùng đã đăng mật khẩu giống với mật khẩu trong cơ sở dữ liệu chưa. Trường cho mật khẩu cũ là 'oldpass'. Trình xác thực tùy chỉnh mà tôi đã tạo được gọi là 'passcheck'. Nó sẽ thất bại hoặc vượt qua cho phù hợp.Trình xác thực Laravel 4 cho trường mật khẩu trong tài khoản chỉnh sửa

Mã UsersController của tôi bên dưới không hoạt động. Tôi có thể làm gì sai?

$rules = array(
     'oldpass' => 'passcheck', 
    ); 

    $messages = array(
     'passcheck' => 'Your old password was incorrect', 
    ); 


    Validator::extend('passcheck', function($attribute, $value, $parameters) 
    { 
     if(!DB::table('users')->where('password', Hash::make(Input::get('oldpass')))->first()){ 
      return false; 
     } 
     else{ 
      return true; 
     }; 
    }); 

    $validator = Validator::make($inputs, $rules, $messages); 
+0

vậy câu hỏi là gì? –

+0

Hehe, @TryingTobemyselfRahul Tôi vừa cập nhật câu hỏi. Cảm ơn vì sự đúng đắn của bạn. Vui lòng kiểm tra – TechyTimo

Trả lời

19

Bạn nên sử dụng một cái gì đó như thế này,

$user = DB::table('users')->where('username', 'someusername')->first(); 
if (Hash::check(Input::get('oldpass'), $user->password)) { 
    // The passwords match... 
    return true; 
} 
else { 
    return false; 
} 

Vì vậy, bạn có để có được những kỷ lục sử dụng username hoặc field bất kỳ khác và sau đó kiểm tra mật khẩu.

@lucasmichot cung cấp giải pháp thậm chí ngắn hơn:

Validator::extend('passcheck', function ($attribute, $value, $parameters) 
{ 
    return Hash::check($value, Auth::user()->getAuthPassword()); 
}); 
+0

Cảm ơn bạn rất nhiều! Làm thế nào về bất kỳ đầu vào khác mà không băm, ví dụ như một hộp kiểm mà im tryng để sử dụng với: \t \t if (Input :: get ('termsandconditions') == '0') {return false;} else {return true;} ;}); – TechyTimo

+2

Bạn được chào đón, 'if (Input :: get ('termsandconditions') == 0) {// not checked}', cũng kiểm tra [accepted] (http://four.laravel.com/docs/validation#rule -nhận được) quy tắc xác thực. –

4

Xin vui lòng không buộc quy tắc của bạn đến một yếu tố Html. Sử dụng các tham số mà Laravel cung cấp để tạo các quy tắc tùy chỉnh của bạn. Điều này sẽ được (asuming rằng bạn có một người dùng xác thực):

Validator::extend('passcheck', function($attribute, $value, $parameters) { 
    return Hash::check($value, Auth::user()->password); // Works for any form! 
}); 

$messages = array(
    'passcheck' => 'Your old password was incorrect', 
); 

$validator = Validator::make(Input::all(), [ 
    'oldpass' => 'passcheck', 
    // more rules ... 
], $messages); 
6

tôi sẽ làm nó như thế này:

/** 
* Rule is to be defined like this: 
* 
* 'passcheck:users,password,id,1' - Means password is taken from users table, user is searched by field id equal to 1 
*/ 
Validator::extend('passcheck', function ($attribute, $value, $parameters) { 
    $user = DB::table($parameters[0])->where($parameters[2], $parameters[3])->first([$parameters[1]]); 
    if (Hash::check($value, $user->{$parameters[1]})) { 
     return true; 
    } else { 
     return false; 
    } 
}); 

quy tắc xác nhận này sẽ làm cho truy vấn cơ sở dữ liệu để kiểm tra mật khẩu hiện tại của người dùng

Bạn có thể làm cho nó ngắn hơn và lưu truy vấn:

Validator::extend('passcheck', function ($attribute, $value, $parameters) { 
    return Hash::check($value, Auth::user()->getAuthPassword()); 
}); 
Các vấn đề liên quan