3

zendフォームバリデーターを使用して、パスワードに少なくとも1つのアルファベット、数字、記号が含まれているかどうかを確認する方法があるかどうかを尋ねたいと思います。

私の知る限り、英数字などしかありません。http: //framework.zend.com/manual/1.7/en/zend.validate.set.html

4

2 に答える 2

6

これが私が使用するカスタムパスワードバリデーターです。パスワード要件のオプションの配列を渡すことができ、オプションに基づいてパスワード要件を説明する文字列を返すことができます。

使用法:

$passwordOpts = array('requireAlpha' => true,
                      'requireNumeric' => true,
                      'minPasswordLength' => 8);

$pwValidator = new My_Validator_SecurePassword($passwordOpts);

$password = new Zend_Form_Element_Password('password', array(
    'validators' => array($pwValidator),
    'description' => $pwValidator->getRequirementString(),
    'label' => 'Password:',
    'required' => true,
));

バリデーターによって出力される要件文字列の例は次のようになります。

パスワードは8文字以上で、1桁の数字を含み、1つの英字を含む必要があります。

バリデーター:

<?php

class My_Validator_SecurePassword extends Zend_Validate_Abstract
{
    const ALL_WHITESPACE = 'allWhitespace';
    const NOT_LONG       = 'notLong';
    const NO_NUMERIC     = 'noNumeric';
    const NO_ALPHA       = 'noAlpha';
    const NO_CAPITAL     = 'noCapital';

    protected $_minPasswordLength = 8;
    protected $_requireNumeric    = true;
    protected $_requireAlpha      = true;
    protected $_requireCapital    = false;

    protected $_messageTemplates = array(
        self::ALL_WHITESPACE => 'Password cannot consist of all whitespace',
        self::NOT_LONG       => 'Password must be at least %len% characters in length',
        self::NO_NUMERIC     => 'Password must contain at least 1 numeric character',
        self::NO_ALPHA       => 'Password must contain at least one alphabetic character',
        self::NO_CAPITAL     => 'Password must contain at least one capital letter',
    );

    public function __construct($options = array())
    {        
        $this->_messageTemplates[self::NOT_LONG] = str_replace('%len%', $this->_minPasswordLength, $this->_messageTemplates[self::NOT_LONG]);

        if (isset($options['minPasswordLength'])
            && Zend_Validate::is($options['minPasswordLength'], 'Digits')
            && (int)$options['minPasswordLength'] > 3)
            $this->_minPasswordLength = $options['minPasswordLength'];

        if (isset($options['requireNumeric'])) $this->_requireNumeric = (bool)$options['requireNumeric'];
        if (isset($options['requireAlpha']))   $this->_requireAlpha   = (bool)$options['requireAlpha'];
        if (isset($options['requireCapital'])) $this->_requireCapital = (bool)$options['requireCapital'];

    }

    /**
     * Validate a password with the set requirements
     * 
     * @see Zend_Validate_Interface::isValid()
     * @return bool true if valid, false if not
     */
    public function isValid($value, $context = null)
    {
        $value = (string)$value;
        $this->_setValue($value);

        if (trim($value) == '') {
            $this->_error(self::ALL_WHITESPACE);
        } else if (strlen($value) < $this->_minPasswordLength) {
            $this->_error(self::NOT_LONG, $this->_minPasswordLength);
        } else if ($this->_requireNumeric == true && preg_match('/\d/', $value) == false) {
            $this->_error(self::NO_NUMERIC);
        } else if ($this->_requireAlpha == true && preg_match('/[a-z]/i', $value) == false) {
            $this->_error(self::NO_ALPHA);
        } else if ($this->_requireCapital == true && preg_match('/[A-Z]/', $value) == false) {
            $this->_error(self::NO_CAPITAL);
        }

        if (sizeof($this->_errors) > 0) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * Return a string explaining the current password requirements such as length and character set
     * 
     * @return string The printable message explaining password requirements
     */
    public function getRequirementString()
    {
        $parts = array();

        $parts[] = 'Passwords must be at least ' . $this->_minPasswordLength . ' characters long';

        if ($this->_requireNumeric) $parts[] = 'contain one digit';
        if ($this->_requireAlpha)   $parts[] = 'contain one alpha character';
        if ($this->_requireCapital) $parts[] = 'have at least one uppercase letter';

        if (sizeof($parts) == 1) {
            return $parts[0] . '.';
        } else if (sizeof($parts) == 2) {
            return $parts[0] . ' and ' . $parts[1] . '.';
        } else {
            $str = $parts[0];
            for ($i = 1; $i < sizeof($parts) - 1; ++$i) {
                $str .= ', ' . $parts[$i];
            }

            $str .= ' and ' . $parts[$i];

            return $str . '.';
        }
    }
}

これが誰かを助けることを願っています。

于 2012-08-12T18:26:37.570 に答える
1

Zend Frameworkには、パスワード用のプレハブのバリデーターはありません。

ただし、バリデーターの作成の例3を見ると、パスワードバリデーターがどうあるべきかについての良い例が見つかります。

それはかなりうまくいきます。私はそれのバージョンを自分で使用します。

于 2012-08-12T16:57:20.527 に答える