Как ограничить количество попыток авторизации.

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Ответить
Ren4ik
Сообщения: 49
Зарегистрирован: 2011.10.12, 15:32

Как ограничить количество попыток авторизации.

Сообщение Ren4ik »

К примеру, при нескольких не успешных попыток, блокировать форму авторизации на пару минут???
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: Как ограничить количество попыток авторизации.

Сообщение yan »

здесь например после нескольких попыток показывается капча
https://github.com/clevertech/YiiBoiler ... inForm.php
https://github.com/clevertech/YiiBoiler ... /login.php
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Как ограничить количество попыток авторизации.

Сообщение futbolim »

айпишник ложите в сессию
Ren4ik
Сообщения: 49
Зарегистрирован: 2011.10.12, 15:32

Re: Как ограничить количество попыток авторизации.

Сообщение Ren4ik »

как это организовать???
вот мой компонент UserIdentity

Код: Выделить всё

<?php

class UserIdentity extends CUserIdentity
{
    public function authenticate()
    {
        $file=Yii::app()->params['file'];
        $users=array(
            'admin'=>'admin',
        );
        file_put_contents($file, serialize($users));
        
        $users = unserialize(trim(file_get_contents($file)));
        if(!isset($users[$this->username]))
            $this->errorCode=self::ERROR_USERNAME_INVALID;
        elseif($users[$this->username]!==$this->password)
            $this->errorCode=self::ERROR_PASSWORD_INVALID;
        else
            $this->errorCode=self::ERROR_NONE;
        return !$this->errorCode;
        }
}
модель LoginForm

Код: Выделить всё

<?php
class LoginForm extends CFormModel
{    
    public $username;
    public $password;
    public $rememberMe;

    private $_identity;

    public function rules()
    {
        return array(
            array('username, password', 'required'),
            array('rememberMe', 'boolean'),
            array('password', 'authenticate'),
        );
    }

    public function attributeLabels()
    {
        return array(
            'username'=>'Логин',
            'password'=>'Пароль',
            'rememberMe'=>'Запомнить меня',
        );
    }

    public function authenticate($attribute,$params)
    {
        if(!$this->hasErrors())
        {
            $identity=new UserIdentity($this->username,$this->password);
            $identity->authenticate();
                
                switch($identity->errorCode)
                {
                     case UserIdentity::ERROR_NONE: {
                        break;
                    }
                    case UserIdentity::ERROR_USERNAME_INVALID: {
                        $this->addError('username','Пользователь не существует!');
                        break;
                    }
                     case UserIdentity::ERROR_PASSWORD_INVALID: {
                        $this->addError('password','Вы указали неверный пароль!');
                         break;
                    }
                }
        }
    }

    public function login()
    {
        if($this->_identity===null)
        {
            $this->_identity=new UserIdentity($this->username,$this->password);
            $this->_identity->authenticate();
        }
        if($this->_identity->errorCode===UserIdentity::ERROR_NONE)
        {
            $duration=$this->rememberMe ? 3600*24*7 : 0; // 7 days
            Yii::app()->user->login($this->_identity,$duration);
            return true;
        }
        else
            return false;
    }
}
и вот контроллер SiteController

Код: Выделить всё

<?php

class SiteController extends Controller
{
    public function actionIndex()
    {
        $this->render('index');
    }
    
    public function filters()
    {
        return array(
            'accessControl',
        );
    }

    public function actionError()
    {
        if($error=Yii::app()->errorHandler->error)
        {
            if(Yii::app()->request->isAjaxRequest)
                echo $error['message'];
            else
                $this->render('error', $error);
        }
    }
    public function actionLogin()
    {
        $model=new LoginForm;

        if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
        {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }

        if(isset($_POST['LoginForm']))
        {
            $model->attributes=$_POST['LoginForm'];
            if($model->validate() && $model->login())
                $this->redirect(Yii::app()->user->returnUrl);
        }
        $this->render('login',array('model'=>$model));
    }

    public function actionLogout()
    {
        Yii::app()->user->logout();
        $this->redirect(Yii::app()->homeUrl);
    }
}
при этом вместо БД я использую *.txt в main у меня прописан путь к нему!!
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: Как ограничить количество попыток авторизации.

Сообщение lancedevnull »

futbolim писал(а):айпишник ложите в сессию
от скрипта не поможет, а руками ломать имхо бред
Ren4ik
Сообщения: 49
Зарегистрирован: 2011.10.12, 15:32

Re: Как ограничить количество попыток авторизации.

Сообщение Ren4ik »

частично задачу решил!!
Но все же есть еще вопрос, объясните пожалуйста как правильно вызывать int time(void)
я делаю

Код: Выделить всё

$round_numerator = 60 * 5;
        $rounded_time = (time() - $round_numerator );
для того что бы потом

Код: Выделить всё

if($rounded_time<$users['time'])
                              $this->addError('button','Форма заблокирована на 5 минут');
как time возвращает количество секунд???
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Как ограничить количество попыток авторизации.

Сообщение futbolim »

Ren4ik писал(а):частично задачу решил!!
Но все же есть еще вопрос, объясните пожалуйста как правильно вызывать int time(void)
я делаю

Код: Выделить всё

$round_numerator = 60 * 5;
        $rounded_time = (time() - $round_numerator ); 
для того что бы потом

Код: Выделить всё

if($rounded_time<$users['time'])
                              $this->addError('button','Форма заблокирована на 5 минут'); 
как time возвращает количество секунд???
так: time()
Ren4ik
Сообщения: 49
Зарегистрирован: 2011.10.12, 15:32

Re: Как ограничить количество попыток авторизации.

Сообщение Ren4ik »

наверное я не правильно выразился))))
$rounded_time = (time() - $round_numerator ); - здесь я сделал на 5 минут меньше от текущего!!!
if($rounded_time<$users['time']) - а вот здесь я проверяю, время которое на 5 минут меньше, от текущего в файле!
так вот, как $rounded_time будит возвращать те 5 минут на которые я уменьшил, что бы когда значения времени стали равны, допустим происходил какой то переход...
Arnowt
Сообщения: 182
Зарегистрирован: 2013.09.13, 11:11

Re: Как ограничить количество попыток авторизации.

Сообщение Arnowt »

time() показывает кол-во секунд прошедших от начала эпохи UNIX на момента вызова.
http://www.php.net/manual/ru/function.time.php
Ren4ik
Сообщения: 49
Зарегистрирован: 2011.10.12, 15:32

Re: Как ограничить количество попыток авторизации.

Сообщение Ren4ik »

всем спасибо за помощь, РАЗОБРАЛСЯ уже)))
asisdes
Сообщения: 202
Зарегистрирован: 2013.10.03, 15:54

Re: Как ограничить количество попыток авторизации.

Сообщение asisdes »

Напиши свое рецепт решение!
Будет полезно, от всякого бруто и прочего!
Изображение
Аватара пользователя
dignityinside
Сообщения: 76
Зарегистрирован: 2013.04.04, 17:57
Контактная информация:

Re: Как ограничить количество попыток авторизации.

Сообщение dignityinside »

Мне тоже интересно было бы посмотреть такой рецепт.
Мой блог:
https://protonalex.com
Ответить