Yii,

2012-11-05 19 views
7

मैं एक आवेदन के लिए Yii उपयोग कर रहा हूँ "पासवर्ड के उपयोगकर्ता परिवर्तन" लागू करने के लिए सबसे अच्छा तरीका है, मैं एक बहुत ही सरल उपयोगकर्ता प्रबंधन लिख रहा हूँ,, पंजीकरण के हटाने और उपयोगकर्ताओं को अद्यतन करने की तरह ... मौजूदा उपयोगकर्ता मैं अद्यतन करने के लिए इससे पहले कि पहले पुराने पासवर्ड जाँच नई डाला पासवर्ड के लिए इसे बदलने की जरूरत है। तो यहाँ खेतों मैं रूप में है:Yii,

username:---- 
old_password:--- 
new_password:--- 

और मेरे उपयोगकर्ता तालिका इस प्रकार है:

id, username, password 

मैं कैसे new_password साथ यह अद्यतन करने से पहले old_password मान्य कर सकते हैं? मैं हमेशा की तरह php कोडिंग पता है, लेकिन मैं जानना चाहता हूँ कि क्या कोई Yii चाल है कि यह स्वचालित रूप से करता है ...

अग्रिम

+1

जब भी संभव हो, आपको मौजूदा प्रमाणीकरण ढांचे का फिर से उपयोग करना चाहिए, क्योंकि, वास्तव में, यह जटिल है। उदाहरण के लिए, https://github.com/delight-im/PHP-Auth पर एक नज़र डालें जो ढांचा-अज्ञेयवादी और डेटाबेस-अज्ञेयवादी दोनों है। – caw

उत्तर

4

धन्यवाद इसका सरल एक action अद्यतन पारित करने के लिए तर्क है कि बनाने के कर रहे हैं। इस मामले actionChangePass और validate वहाँ में नए action करने के लिए form के लिए

मेक लक्ष्य जिस तरह से आप चाहते हैं।

मोटे उदाहरण इस

public function actionChangePass($id) 
    { 
    $user = loadModel($id) 
    if(md5($_POST['User']['old_password']) === $user->password) 
    { 
     $user->setScenario('changePassword'); 
     $user->attributes = $_POST['User'];     
     $user->password = md5($_POST['User']['new_password']); 
     if($user->save()) 
     Yii::app()->user->setFlash('passChanged', 'Your password has been changed <strong>successfully</strong>.'); 
    }    
    else 
    { 
     Yii::app()->user->setFlash('passChangeError', 'Your password was not changed because it did not matched the <strong>old password</strong>.');      
    } 
} 

की तरह रखा जा सकता है इसके अलावा आप अपने उपयोगकर्ता UserModel में $ old_password है सुनिश्चित करें। इसके अलावा, आप नए पासवर्ड की आवश्यकता

वहाँ कुछ अलग अलग तरीकों से भी हो सकता है लेकिन मैं इसे इस

पसंद करते हैं इसके अलावा अपने कस्टम मान्यता बनाने scenariochangePassword

+1

शांत यियिश। Upvoted! –

+0

वास्तव में नहीं ... यिश एक नया फॉर्म बनाना होगा और वहां सभी तर्क डालेंगे – ThomasVdBerge

+0

@ स्टेफानो धन्यवाद –

1

यहाँ क्या है बनाने के लिए मॉडल के नियमों में कुछ सत्यापन कर सकते हैं मैं व्यक्तिगत रूप से करना पसंद करता हूं। यह इसका एक जटिल संस्करण है। दो क्षेत्रों आप पासवर्ड की प्रक्रिया में मदद मिलेगी मॉडल करने के लिए जोड़ें। इन दो क्षेत्रों डेटाबेस में मौजूद नहीं है ध्यान दें और वर्तमान में जीआईआई कोड उत्पन्न नहीं हैं। जैसे

class UserModel extends CActiveRecord 
{ 
    /*Password attributes*/ 
    public $initial_password; 
    public $repeat_password; 
    //.................. 
} 

रूप में, कुछ भी इनपुट के साथ डेटाबेस में वास्तविक पासवर्ड क्षेत्र संबद्ध नहीं करते। डेटाबेस में दो फ़ील्ड इन दो क्षेत्रों से जुड़े होना चाहिए। फॉर्म का संक्षिप्त संस्करण बन जाता है:

<?php echo $form->errorSummary($model); ?> 


    <?php echo $form->passwordFieldRow($model,'initial_password',array('class'=>'span5','maxlength'=>128)); ?> 

    <?php echo $form->passwordFieldRow($model,'repeat_password',array('class'=>'span5','maxlength'=>128)); ?> 

अब मुझे कैसे पता चलेगा कि उपयोगकर्ता ने पासवर्ड बदल दिया है? मैं बस BeforeSave (चेक इन) यदि दो क्षेत्रों खाली हैं और उनकी तुलना और फिर पासवर्ड बदल दें। अगर वे खाली हैं तो मैं पूरी चीज को पूरी तरह से छोड़ देता हूं। तो BeforeSave का सरल संस्करण है:

/** 
    * Called before saving the model 
    */ 
    protected function beforeSave() 
    { 
     if(parent::beforeSave()) 
     { 
      if($this->isNewRecord) 
      { 
       $this->password = HashYourPass($this->initial_password); 
      } 
      else 
       { 
        //should we update password? 
        if($this->initial_password !== '') 
        { 
         //encrypt password and assign to password field 
         $this->password = HashYourPass($this->initial_password); 
         //Check old password match here 
        } 
       } 
      return true; 
     } 
     else 
      return false; 
    } 

अब आप अपने प्रश्न के अनुसार, एक बात याद आ रही है। पुराना पासवर्ड जांच रहा है! आप नए मॉडल फ़ील्ड को एल्ड पासवर्ड और उसके फॉर्म इनपुट कंट्रोल जोड़ सकते हैं। फिर beforesave विधि में (जैसा कि टिप्पणी द्वारा इंगित किया गया है) आप डेटाबेस से वास्तविक पासवर्ड फ़ील्ड के साथ इनपुट की तुलना कर सकते हैं और यदि वे मेल खाते हैं तो पासवर्ड बदलें।

आप उन्हें परिदृश्यों के साथ सत्यापन नियम के रूप में जोड़ सकते हैं लेकिन मुझे यह किसी भी तरह जटिल और हाथ में थोड़ा समय मिला, मैं इस विधि के साथ गया।

9

आप बकवास के साथ अपने मॉडल को दूषित नहीं करना चाहिए।कृपया, इन बुनियादी एमवीसी सिद्धांतों को हमेशा ध्यान में रखें:

  • आपके नियंत्रक को आपके मॉडल के कार्यान्वयन से अवगत नहीं होना चाहिए।
  • अपने मॉडल के व्यवसाय मॉडल से जुड़े सामानों के साथ अपने मॉडल को प्रदूषित न करें।

हमेशा की तरह, पुन: प्रयोज्य कोड बनाने के अपने कोड "सूखी" (अपने आप को दोहराना नहीं)

वैसे बनाने के लिए, उपयोगकर्ता नाम क्षेत्र के उद्देश्य क्या है? चूंकि फॉर्म केवल लॉग इन उपयोगकर्ता के लिए उपलब्ध होगा, उपयोगकर्ता नाम को पहले ही वाईआई :: ऐप() -> उपयोगकर्ता के साथ एक्सेस किया जा सकता है।

<?php 
// models/ChangePasswordForm.php 

class ChangePasswordForm extends CFormModel 
{ 
    /** 
    * @var string 
    */ 
    public $currentPassword; 

    /** 
    * @var string 
    */ 
    public $newPassword; 

    /** 
    * @var string 
    */ 
    public $newPasswordRepeat; 

    /** 
    * Validation rules for this form. 
    * 
    * @return array 
    */ 
    public function rules() 
    { 
     return array(
      array('currentPassword, newPassword, newPasswordRepeat', 'required'), 
      array('currentPassword', 'validateCurrentPassword', 'message'=>'This is not your password.'), 
      array('newPassword', 'compare', 'compareAttribute'=>'validateNewPassword'), 
      array('newPassword', 'match', 'pattern'=>'/^[a-z0-9_\-]{5,}/i', 'message'=>'Your password does not meet our password complexity policy.'), 
     ); 
    } 

    /** 
    * I don't know your hashing policy, so I assume it's simple MD5 hashing method. 
    * 
    * @return string Hashed password 
    */ 
    protected function createPasswordHash($password) 
    { 
     return md5($password); 
    } 

    /** 
    * I don't know how you access user's password as well. 
    * 
    * @return string 
    */ 
    protected function getUserPassword() 
    { 
     return Yii::app()->user->password; 
    } 

    /** 
    * Saves the new password. 
    */ 
    public function saveNewPassword() 
    { 
     $user = UserModel::findByPk(Yii::app()->user->username); 
     $user->password = $this->createPasswordHash($this->newPassword); 
     $user->update(); 
    } 

    /** 
    * Validates current password. 
    * 
    * @return bool Is password valid 
    */ 
    public function validateCurrentPassword() 
    { 
     return $this->createPasswordHash($this->currentPassword) == $this->getUserPassword(); 
    } 
} 

उदाहरण नियंत्रक कार्रवाई:

public function actionChangePassword() 
{ 
    $model=new ChangePasswordForm(); 
    if (isset($_POST['ChangePasswordForm'])) { 
     $model->setAttributes($_POST['ChangePasswordForm']); 
     if ($model->validate()) { 
      $model->save(); 
      // you can redirect here 
     } 
    } 

    $this->render('changePasswordTemplate', array('model'=>$model)); 
} 

उदाहरण टेम्पलेट कोड:

<?php echo CHtml::errorSummary($model); ?> 

    <div class="row"> 
     <?php echo CHtml::activeLabel($model,'currentPassword'); ?> 
     <?php echo CHtml::activePasswordField($model,'currentPassword') ?> 
    </div> 

    <div class="row"> 
     <?php echo CHtml::activeLabel($model,'newPassword'); ?> 
     <?php echo CHtml::activePasswordField($model,'newPassword') ?> 
    </div> 

    <div class="row"> 
     <?php echo CHtml::activeLabel($model,'newPasswordRepeat'); ?> 
     <?php echo CHtml::activePasswordField($model,'newPasswordRepeat') ?> 
    </div> 

    <div class="row submit"> 
     <?php echo CHtml::submitButton('Change password'); ?> 
    </div> 

    <?php echo CHtml::endForm(); ?> 
</div><!-- form --> 

टेम्पलेट बहुत आसान बनाने के लिए होना चाहिए। कुछ मामूली tweaks के साथ, यह कोड & कॉपी करने के लिए तैयार है एक और Yii परियोजना के लिए चिपकाया।

+0

क्या आप टेम्पलेट कोड साझा कर सकते हैं? – AlphaMale

+0

मैंने उदाहरण टेम्पलेट कोड के साथ पोस्ट अपडेट किया। विचारों में रूपों को प्रबंधित करने के तरीके पर आपको आधिकारिक वाईआई ट्यूटोरियल का पालन करना चाहिए। –