В инете полно скриптов, реализающих авторизацию (регистрацию + авторизацию) на сайте. И наверняка почти каждый учатсник этого форума делал свои наблоски для авторизации. А какая авторизация лучше (в плане защищенности, оптимизации) и т.д.? Никто не сравнивал скрипты или сами алгоритмы авторизации? Для начала вот http://habrahabr.ru/blogs/php/13726/ ЗЫ Похоливарим? :twisted:
Регистрация должна выглядить как-то так: PHP: <?php $user = accounts::newOne(); $user->nick = $nick; $user->email = $email; .... $user->save(); или accounts::save($user); предварительно правильность формы проверена и данные сложены вот в эти $nick, $email и т.п. Соответственно потом авторизация PHP: <? $user = accounts::loadOne(array('nick'=>$nick, 'password'=>$password)); if ($user == false) { ошибка } else { $_SESSION['authed'] = $user->id; } в дальнейшем PHP: <? if (key_exists('authed', $_SESSION)) { $user = accounts::loadOne('id'=>$_SESSION['authed']); echo 'Привет, '.$user->nick; А алгоритм... можно по всякому написать, все равно одно и то же - проверка по регулярке или функции, эскейп, запрос к БД, разбор результата, ответ.
[vs] PHP: $auth->check($user, $pass); или PHP: $auth->user = $user; $auth->pass = $pass; $auth->check(); ?
Я выкладывал свой способ http://www.php.ru/forum/viewtopic.php?t=26841 Хочу сказать что он достаточно безопасен, прост и в меру гибок... (только одна мелочь, пароль лучше не кидать в базу а только его хэш)
admyx я пришел к выводу, что в отдельном классе auth смысла нет. Достаточно аккаунтов, и свой handler для сессий, если надо пользователей онлайн контролировать. А так - конечно первый вариант!
[vs] А как насчет PHP: <?php class _USER { public $authorized = false; public $data = array(); public function __construct(); // check authorized user public function register() public function login($user, $pass); public function logout(); public function profile(); } Что насчет такой конструкции скажешь?
у меня с пофигом на низком уровне абстракции делается регистрация и авторизация, в кабинете в начале каждого метода стоит $this->checkAuth(); а user будет тупо с ArrayAccess внутри всякие листы, сверху mapper
admyx Так лучше, но проверка на авторизацию не имеет смысла когда создается новый пользователь. И иногда может потребоваться собрать объект без авторизации, например когда один пользователь редактирует другого. Придется добавлять конструктору параметр PHP: public function __construct((bool)$check_auth); а это согласись как-то костыльно
Имеет. Если пользователь авторизован, то он не может зарегистрироваться. А вот тогда мы, получается, еще имеем дело с разграничением прав юзверей. Это уже интереснее Ну а зачем нам еще раз проверять? Проще добавить метод edit, или к методу profile добавить параметры profile ($edit = false, $uid = null)
Т.е. если пользователь авторизирован, мы не можем сконструировать новый объект пользователя? Есть смысл разграничивать доступ к интерфейсу для выполнения каких-то действий, нет смысла ограничивать в этом программиста. Придется делать лишние правила прав пользователей, и это при том что кодер может сделать тупо mysql-запрос.
Эмм.. А зачем? У нас есть методы, доступные авторизованноу пользователю.. А какие он может использовать методы - определяет его группа - уровень доступа. Или я не прав где-то?
а я вообще хотел в сессию писать access и потом по нему с помощью factory создавать юзера или глупая затея?(как это все дальше будет пока не думал)
Ну к примеру в одном смс-сервисе когда приходит смс создается без всякой авторизации объект пользователя, идентифицируясь по номеру телефона, вносятся изменения и сохраняются, пароль меняется. Если правами регулировать доступность методов, то менять пароль можно доверить только самому пользователю, и, скажем, администратору. А смс-ресиверу заводить отдельную группу. Это лишние усложнения. Угрозу могут представлять только переменные, полученые по HTTP. Если группа не позволяет менять пароль, то и не проверять наличие этого поля, вот и все. Больше примеров правда у меня нет)
Padaboo Ошибки скрипта, или ошибки ввода неправильных данных? Лично в ошибках скрипта у меня движок даже нотисы не пропускает и сразу выкидывает kernel panic.
у меня так получилось сегодня, потом вставляю в основной шаблон то что возвращает функция, ошибку либо пустую строку PHP: <?php private function getError(){ $errors = array(1 => 'не верный код с картинки', 2 => 'имя должно быть от 3 до 20 знаков', 3 => 'пароли не совпадают', 4 => 'не правильно указан e-mail', 5 => 'e-mailы не совпадают', 6 => 'пароль должен быть от 4 до 14 знаков', 7 => 'такой e-mail уже используется', 8 => 'подтвердите регистрацию' ); $error = ''; if(isset($_GET['error']) && array_key_exists($_GET['error'], $errors)){ $error = (int)$_GET['error']; $this->registry['view']->setPath('template/auth/error_panel.html'); $this->registry['view']->setVar('error', $errors[$error]); $error = $this->registry['view']->prepare(); } return $error; } вот думаю как лучше сделать, может так: PHP: <?php private function catchError(){ $errors = array(1 => 'не верный код с картинки', 2 => 'имя должно быть от 3 до 20 знаков', 3 => 'пароли не совпадают', 4 => 'не правильно указан e-mail', 5 => 'e-mailы не совпадают', 6 => 'пароль должен быть от 4 до 14 знаков', 7 => 'такой e-mail уже используется', 8 => 'подтвердите регистрацию' ); $error = ''; if(isset($_GET['error']) && array_key_exists($_GET['error'], $errors)){ $error = (int)$_GET['error']; $error = $errors[$error]; } return $error; } private function getError($error){ $this->registry['view']->setPath('template/auth/error_panel.html'); $this->registry['view']->setVar('error', $error); return $this->registry['view']->prepare(); } тогда такое использование: PHP: <?php $error = $this->catchError(); $error = $this->getError($error); с другой стороны можно зайти и в обном месте поменять и ошибки и шаблон а может быть сделать как то еше admyx тоже не люблю нотисы, напрягают они меня ))
А у меня технология которую надо запатентовать HTML: <tr> <td colspan="2"> <div style="display: <?=$error_nick?>" class="singup-error">Имя пользователя занято или заполнено неверно:</div> </td> </tr> <tr> <td width="170">Имя пользователя:<font color="#FF0000">*</font></td> <td><input type="text" name="su[nick]" maxlength="20" value="<?=$val_nick?>" /></td> <td><span class="singup-info">Ваше уникальное имя на сервисе. Не более 20 символов, только латинские буквы и цифры.</span></td> </tr> display или none или block. :Р
неее я сделаю большую, страшную, красную табличку с ошибкой пока так error_panel: HTML: <span style="color:red">{error}</span>
что то я в замешательстве... пишу кусок для восстановления пароля, вводишь свой мыл(он же логин) пароль находится в зашифрованном виде, не отправлять же его так на почту а если высылать новый, то допустим кто то знает мой мыл, он может менять мне пароль постоянно, он конечно будет приходить новый на почту, но ведь это же никуда не годится Может быть секретный вопрос добавить?
Padaboo, закрой эту тему, попробуй восстановить пароль хотя бы на 5 разных сервисах в интернете, и напиши ответ. Правда, такие банальные вещи даже стыдно советовать.
Отправляй некий код(генерируется при отправлении письма, хранится в таблице users), который надо ввести на сайте. Если он введен правильно(совпал с тем, что в базе, по дате(какое-нить поле edit_time в users) не превышает допустим 2 дня или 2 часа) - показываем страничку на которой юзер вводит новый пароль. обновляем в базе.