2009-08-23 38 views
6

Chúc mừng,CakePHP: Xóa trường mật khẩu khi gửi không thành công

Tôi đang thiết lập biểu mẫu đăng ký khá chuẩn với trường mật khẩu.

Vấn đề là, sau khi gửi không thành công (do trường trống, định dạng không chính xác, v.v.), trình điều khiển tải lại trang đăng ký, nhưng với trường mật khẩu có chứa giá trị băm của mật khẩu đã nhập trước đó. Làm cách nào để làm trống sau mỗi lần gửi không thành công?

Xem:

echo $form->password('Vendor.password', array('class' => 'text-input')); 

Bộ điều khiển:

Security::setHash('sha1'); 
$this->Auth->sessionKey = 'Member'; 
$this->Auth->fields = array(
    'username' => 'email', 
    'password' => 'password' 
); 

Trợ giúp được rất nhiều đánh giá cao, cảm ơn!

Trả lời

9

Bạn có thể chạy vào một vấn đề khác xuống đường với CakePHP xác nhận mật khẩu.

Vấn đề là mật khẩu băm bánh trước tiên, sau đó không xác thực, điều này có thể khiến đầu vào bị lỗi ngay cả khi nó hợp lệ theo quy tắc của bạn. Đây là lý do tại sao mật khẩu được trả lại cho trường nhập được băm thay vì bình thường.


để khắc phục điều này, thay vì sử dụng tên trường đặc biệt 'mật khẩu', hãy sử dụng tên khác như 'tmp_pass'. Bằng cách này, CakePHP Auth sẽ không tự động băm trường.

Dưới đây là một mẫu

echo $form->create('Vendor', array('action' => 'register')); 
echo $form->input('email'); 
echo $form->input('tmp_pass', array('label' => 'Password','type'=>'password')); 
echo $form->end('Register'); 

Trong mô hình bán hàng của bạn, đừng gán quy tắc xác nhận để 'mật khẩu' thay vì chỉ định các quy tắc để 'tmp_pass', ví dụ

var $validate = array('email' => 'email', 'password' => ... password rules...); 

trở thành

var $validate = array('email' => 'email', 'tmp_pass' => ... password rules...); 

Cuối cùng, trong mô hình Nhà cung cấp của bạn, hãy triển khai beforeSave().

Trước tiên, hãy xem liệu dữ liệu hợp lệ hóa ('tmp_pass' sẽ được xác thực theo quy tắc của bạn).

Nếu thành công, hãy tự băm tmp_pass và đặt nó vào $ this-> data ['Vendor'] ['password'] rồi trả về true. Nếu không thành công, trả về false.

function beforeSave() { 
    if($this->validates()){ 
     $this->data['Vendor']['password'] = sha1(Configure::read('Security.salt') . $this->data['User']['tmp_pass']); 
     return true; 
    } 
    else 
     return false; 
} 
+1

+1 - điều này cũng rất hữu ích cho tôi, tuy nhiên tôi khuyên bạn nên sử dụng các hàm 'Auth-> password()' hoặc 'Auth-> hashPasswords()' đúng hơn hơn là ngâm mình và băm. – nickf

+0

Bạn không nên ** tự băm mật khẩu bằng 'sha1', vì điều này ** có thể ** giới thiệu mâu thuẫn với cách' Auth' (nếu đó là những gì bạn đang sử dụng), hãy băm mật khẩu xuống đường. Sử dụng '$ this-> Auth-> password()' để thay thế! – deceze

+1

@deceze, nhìn vào nguồn, 'Auth :: hashPasswords()' sẽ gọi hàm 'User :: hashPassword()' nếu nó được định nghĩa, trong khi 'Auth :: password()' thì không. – nickf

8

?

password('Vendor.password', array('class' => 'text-input','value'=>'')) 
+0

Cảm ơn, điều này cũng hoạt động. Đây có phải là cách tiêu chuẩn để đạt được những gì tôi muốn không? –

+0

đó là cách bạn đặt giá trị của trường nhập cho trợ giúp biểu mẫu –

3

Trong điều khiển của bạn:

function beforeRender() { 
    parent::beforeRender(); 
    $this->data['Vendor']['password'] = ''; 
} 
+0

hmmm, điều này có vẻ hơi khó hiểu đối với tôi, vì tôi có nhiều kiểu người dùng với các thuộc tính riêng biệt trong db và có thể thêm nhiều hơn trong tương lai.Nhưng bây giờ nó hoạt động tôi đoán, cảm ơn :) –

Các vấn đề liên quan