0

データベースを介してユーザーの電子メールとパスワードをチェックするログインフォームがあります。一致する場合、ユーザーはログインできます。問題は、データベース内の任意のパスワードに一致する電子メールまたは任意の電子メールに一致するパスワードをチェックすることです。データベースで。この特定のユーザーの電子メールをチェックして、データベースに存在するパスワードと一致するのではなく、パスワードと一致するようにします。

これが私が間違っていたと思うコントローラーです:

$loginForm = new Application_Form_UserLogin();
if ($this->getRequest()->isPost('loginForm'))
    {   
        $email_adrress = $this->getRequest()->getParam('email_address');
        $password = $this->getRequest()->getParam('password');

        /************ Login Form ************/
        if ($loginForm->isValid($this->getRequest()->getParams()))
        {
            $user = $this->_helper->model('Users')->createRow($loginForm->getValues()); 
            $user = $this->_helper->model('Users')->fetchRowByFields(array('email' => $email_adrress, 'hash' => $password));

            if($user) 
            {
                Zend_Session::rememberMe(86400 * 14);
                Zend_Auth::getInstance()->getStorage()->write($user);
                $this->getHelper('redirector')->gotoRoute(array(), 'invite');
                return;
            } 
            else {
            }               
        }
    }$this->view->loginForm = $loginForm;

私のフォーム:

class Application_Form_UserLogin extends Zend_Form
{
public $email, $password, $submit;

public function init()
{       
    $this->setName('loginForm');        

    $EmailExists = new Zend_Validate_Db_RecordExists(
            array(
                'table' => 'users',
                'field' => 'email'
            )
        );

    //$EmailExists->setMessage('Invalid email address, please try again. *');

    $PasswordExists = new Zend_Validate_Db_RecordExists(
            array(
                'table' => 'users',
                'field' => 'hash'
            )
        );

    $PasswordExists->setMessage('Invalid password, please try again. *');

    $this->email = $this->createElement('text', 'email_address')
                     ->setLabel('Email')
                     ->addValidator($EmailExists)
                     ->addValidator('EmailAddress')
                     ->setRequired(true);

    $this->password = $this->createElement('text', 'password')
                     ->setLabel('Password')
                     ->addValidator($PasswordExists)
                     ->setRequired(true);


    $this->submitButton = $this->createElement('button', 'btn_login')
                            ->setLabel('Login')
                            ->setAttrib('type', 'submit');

    $this->addElements(array($this->email, $this->password, $this->submit));

    $elementDecorators = array(
        'ViewHelper'
    );
    $this->setElementDecorators($elementDecorators);
}

}

4

2 に答える 2

0

このログイン処理を要素の1つにバリデーターとして追加しません。代わりに、Zend_Authコンストラクター引数としてユーザーモデル、電子メール、およびパスワードを使用して認証アダプターを作成します。次に、コントローラーでを呼び出しますZend_Auth::authenticate($adapter)

何かのようなもの:

class Application_Model_AuthAdapter implements Zend_Auth_Adapter_Interface
{
    protected $userModel;   
    protected $email;
    protected $pass;

    public function __construct($userModel, $email, $pass)
    {
        $this->userModel = $userModel;
        $this->email = $email;
        $this->pass = $pass;
    }

    public function authenticate()
    {
        $user = $this->userModel->getByEmailAndPassword($this->email, $this->pass);
        if ($user){
            return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $user);
        } else {
            return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID, null);
        }
    }
}

次に、コントローラーで:

public function loginAction()
{
    $form = new Application_Form_UserLogin();
    if ($this->_request->isPost()) {
        if ($form->isValid($this->_request->getPost())) {
            $data = $form->getValues();
            $email = $data['email'];
            $pass = $data['pass'];
            $userModel = $this->_helper->model('Users');
            $authAdapter = new Application_Model_AuthAdapter($userModel, $email, $pass);
            $result = Zend_Auth::getInstance()->authenticate($adapter);
            if ($result->isValid()){
                // $user= $result->getIdentity(). Use it how you like.
                // Redirect someplace
            } else {
                $this->view->error = 'Invalid login';
            }
        }
    }
    $this->view->form = $form;
}

詳細については、 Zend_Authリファレンスを参照してください。

于 2013-01-08T21:04:28.727 に答える
0

私はあなたがやろうとしている方法に精通していません。fetchRowByFields メソッドは自分で作成したものですか? もしそうなら、コードを見ずにあなたを助けることは困難です.

Zend Framework が提供するメカニズムを使用して、データベースに対して認証を実行することを検討しましたか?

Zend Framework の公式マニュアルには、認証の実装方法に関する簡単なチュートリアルが含まれています: http://framework.zend.com/manual/1.12/en/learning.multiuser.authentication.html

Zend_Auth クラスでアダプターを使用して、必要なことを行います。

于 2013-01-08T20:32:35.243 に答える