Перейти к содержимому


Авторизация по E-mail и Login


  • Вы не можете ответить в тему
Сообщений в теме: 9

#1 Salp

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 218 сообщений
Репутация: 54
Продвинутый

Отправлено 08 April 2013 - 08:17 AM

Немного опоздал с этим дополнением, но в отличие от уже имеющегося на форуме, этот вариант позволяет осуществить плавный переход с авторизации по логину на авторизацию по E-mail. Он позволяет старым пользователям входить как по E-mail, так и по Login. Новые пользователи при регистрации и входе уже будут использовать только почтовый адрес.

Итак, самое главное в registration_functions.php

function regAuthenticate($login, $password, $Redirect = true)
{
$q = db_query("select cust_password, CID, ActivationCode, Login FROM ".CUSTOMERS_TABLE." WHERE Login='".xToText($login)."' OR Email='".xToText($login)."'");
$row = db_fetch_row($q);
// echo $login." ".$password."<br>";
//var_dump($row);exit;
if(CONF_ENABLE_REGCONFIRMATION && $row['ActivationCode']){
if($Redirect)RedirectProtected(set_query('&act_customer=1&notact=1'));
else return false;
}
if ($row && strlen( trim($login) ) > 0)
{
if ($row["cust_password"] == cryptPasswordCrypt($password, null) )
{
// set session variables
$_SESSION["log"] = $row["Login"];
$_SESSION["pass"] = cryptPasswordCrypt($password, null);

$_SESSION["current_currency"] = $row["CID"];
// update statistic
stAddCustomerLog( $login );
// move cart content into DB
moveCartFromSession2DB();
return true;
}
else
return false;
}
else return false;
}

здесь же отключим требование чтобы логин не начинался с цифр (почтовые адреса вполне могут с них начинаться):
		//if (!(((ord($login)>=ord("a")) && (ord($login)<=ord("z"))) ||
// ((ord($login)>=ord("A")) && (ord($login)<=ord("Z")))))
// $error = ERROR_LOGIN_SHOULD_START_WITH_LATIN_SYMBOL;
//else


Теперь можно поправить authorization.tpl.html
<td align="left">E-mail или {$smarty.const.CUSTOMER_LOGIN}</td>


Для того чтобы убрать обязательный ввод логина при регистрации правим сначала register.tpl.html
закомментируем ввод логина и вместо него подвинем вверх e-mail:
		<table cellspacing="0" cellpadding="0" align="center">
{* <tr>
<td align="right" valign="middle"><span class="error">*</span> {$smarty.const.CUSTOMER_LOGIN}:&nbsp;</td>
<td valign="middle" align="left"><input type="text" name="login" style="width: 220px;" value="{$login}"></td>
</tr>
<tr>
<td colspan="2" style="height: 6px;"></td>
</tr>
*}
<tr>
<td align="right" valign="middle"><span class="error">*</span> {$smarty.const.CUSTOMER_EMAIL}:&nbsp;</td>
<td valign="middle" align="left"><input type="text" name="email" style="width: 220px;" value="{$email}"></td>
</tr>
<tr>
<td colspan="2" style="height: 6px;"></td>
</tr>

затем отключим проверку на обязательность ввода логина, при регистрации, просто копируя поле email в поле login register.php
		//$isPost = isset($_POST["login"]) && isset($_POST["cust_password1"]);
$isPost = isset($_POST["email"]) && isset($_POST["cust_password1"]);

if ( $isPost ) _copyDataFromPostToPage( $smarty );

if ( isset($_POST["save"]) ) //save user to the database
{
//$login = trim($_POST["login"]);
$login = trim($_POST["email"]);

здесь же:
		function _copyDataFromPostToPage( & $smarty )
{
//$smarty->hassign("login", trim($_POST["login"]) );
$smarty->hassign("login", trim($_POST["email"]) );


Но некоторые пользователи любят регистрироваться по нескольку раз под разными логинами, но с одним и тем же E-mail. Для исключения подобной ситуации в registration_functions.php:
function regIsRegister( $login )
{
$id=trim($_SESSION["log"]);
$q=db_query("select count(*) from ".CUSTOMERS_TABLE." where (Login='".xToText($login)."' OR Email='".xToText($login)."') AND Login!='".xToText($id)."'");
$r = db_fetch_row($q);
//echo $login." ".$id."<br>";
//var_dump($r);exit;
return ( $r[0] != 0 );
}

Дубликаты регистраций с одинаковыми почтовыми адресами придется удалить из базы в ручном режиме. Я для этого просто выгрузил их в excel таблицу и отсортировал по алфавиту - тогда копии легко заметны. Конечно, при большом количестве пользователей придется писать специальный скрипт.
Дубликаты нужно удалять обязательно!

Но что произойдет, если покупатель захочет зайти в личный кабинет и сменить свой E-mail?
Удаляем поле Логин из личного кабинета, E-mail передвигаем на первое место в user_account.tpl.html
	  <table cellspacing="0" cellpadding="0">
<td>{$smarty.const.CUSTOMER_EMAIL}:&nbsp;</td>
<td><b>{$Email}</b></td>
</tr>
<tr>
<td style="height: 3px;"></td>
</tr>
<tr>
<td>{$smarty.const.CUSTOMER_LAST_NAME}:&nbsp;</td>
<td><b>{$last_name} {$first_name}</b></td>
</tr>
<tr>
<td style="height: 3px;"></td>
</tr>
{* <tr>
<td>{$smarty.const.CUSTOMER_LOGIN}:&nbsp;</td>
<td><b>{$login}</b></td>
</tr>
*}

и, соответственно в contact_info.tpl.html
		<table cellspacing="0" cellpadding="0" width="100%">
<tr>
<td align="center">{$smarty.const.STRING_REQUIRED}<br>
<br>
<table cellspacing="0" cellpadding="0" align="center">
{* <tr>
<td align="right" valign="middle"><span class="error">*</span> {$smarty.const.CUSTOMER_LOGIN}:&nbsp;</td>
<td><input type="text" style="width: 250px;" name="login" value="{$login|default:""}"></td>
</tr>
<tr>
<td colspan="2" style="height: 4px;"></td>
</tr>
*}
<tr>
<td align="right" valign="middle"><span class="error">*</span> {$smarty.const.CUSTOMER_EMAIL}:&nbsp;</td>
<td><input type="text" style="width: 250px;" name="email" value="{$email|default:""}"></td>
</tr>
<tr>
<td colspan="2" style="height: 4px;"></td>
</tr>

И последнее, нужно немного изменить contact_info.php
это позволит не менять логин администратора:
<?php
#####################################
# ShopCMS: Скрипт интернет-магазина
# Copyright (c) by ADGroup
# http://shopcms.ru
#####################################
if ( isset($contact_info) && isset($_SESSION["log"]) )
{

// *****************************************************************************
// Purpose copies data from $_POST variable to HTML page
// Inputs $smarty - smarty object
// Remarks
// Returns nothing
function _copyDataFromPostToPage( & $smarty )
{
//$smarty->hassign("login", $_POST["login"] );
$smarty->hassign("login", $_POST["email"] );
$smarty->hassign("cust_password1", $_POST["cust_password1"] );
$smarty->hassign("cust_password2", $_POST["cust_password2"] );
$smarty->hassign("first_name", $_POST["first_name"] );
$smarty->hassign("last_name", $_POST["last_name"] );
$smarty->hassign("email", $_POST["email"] );
$smarty->assign("subscribed4news", (isset($_POST["subscribed4news"])?1:0) );
$additional_field_values = array();
$data = ScanPostVariableWithId( array( "additional_field" ) );
foreach( $data as $key => $val )
{
$item = array( "reg_field_ID" => $key, "reg_field_name" => "",
"reg_field_value" => $val["additional_field"] );
$additional_field_values[] = $item;
}
$smarty->hassign("additional_field_values", $additional_field_values );
}

// *****************************************************************************
// Purpose copies data from DataBase variable to HTML page
// Inputs $smarty - smarty object
// $log - customer login
// Remarks
// Returns nothing
function _copyDataFromDataBaseToPage( & $smarty, $log )
{
$cust_password = 0; $Email = 0; $first_name = 0;
$last_name = 0; $subscribed4news=0; $additional_field_values = 0;
$countryID = 0; $zoneID = 0; $state = 0;
$city = 0; $address = 0;
regGetContactInfo( $log, $cust_password, $Email, $first_name,
$last_name, $subscribed4news, $additional_field_values );
$smarty->assign("login", $log );
$smarty->assign("cust_password1", $cust_password );
$smarty->assign("cust_password2", $cust_password );
$smarty->assign("first_name", $first_name );
$smarty->assign("last_name", $last_name );
$smarty->assign("email", $Email );
$smarty->assign("subscribed4news", $subscribed4news );
$smarty->assign("additional_field_values", $additional_field_values );
}

//if ( isset($_POST["login"]) )
// _copyDataFromPostToPage( $smarty );
if ( isset($_POST["email"]) )
_copyDataFromPostToPage( $smarty );
else
_copyDataFromDataBaseToPage( $smarty, $_SESSION["log"] );
if ( isset($_POST["save"]) )
{
//$login = $_POST["login"];
if (trim($_SESSION["log"]) != "admin") $login = trim($_POST["email"]); else $login = trim($_SESSION["log"]);
$cust_password1 = $_POST["cust_password1"];
$cust_password2 = $_POST["cust_password2"];
$first_name = $_POST["first_name"];
$last_name = $_POST["last_name"];
$Email = $_POST["email"];
$subscribed4news = ( isset($_POST["subscribed4news"]) ? 1 : 0 );
$additional_field_values = ScanPostVariableWithId( array( "additional_field" ) );
if ( ( trim($login) != trim($_SESSION["log"]) ) && regIsRegister($login) )
$error = ERROR_USER_ALREADY_EXISTS;
if ( !isset($error) )
$error = regVerifyContactInfo( $login, $cust_password1, $cust_password2,
$Email, $first_name, $last_name, $subscribed4news,
$additional_field_values );
if ( $error == "" ) unset($error);
if ( !isset($error) )
{
regUpdateContactInfo( $_SESSION["log"], $login, $cust_password1,
$Email, $first_name, $last_name, $subscribed4news,
$additional_field_values );
$_SESSION["log"] = $login;
$_SESSION["pass"] = cryptPasswordCrypt($cust_password1, null);
Redirect( "index.php?contact_info=yes" );
}
else
$smarty->assign( "error", $error );
}
// additional fields
$additional_fields=GetRegFields();
$smarty->assign("additional_fields", $additional_fields );
$smarty->assign("main_content_template", "contact_info.tpl.html");
}
?>


Есть один момент. Если пользователь сменит свой E-mail или пароль из личного кабинета (нажмет "Сохранить" в разделе "Контактная информация"), то он больше не сможет заходить по логину. Но к этому переходу мы и стремимся :)
Да, "admin" это не касается.

Еще поправим russian.php
define('STRING_FORGOT_PASSWORD_FIX', 'Забыли пароль? Пожалуйста, введите Ваш E-mail или логин');
define('ERROR_USER_ALREADY_EXISTS', 'Пользователь с указанным E-mail или Login уже зарегистрирован');


и добавим восстановление пароля по E-mail в registration_functions.php
function regSendPasswordToUser( $login, &$smarty_mail )
{
$q = db_query("select Login, cust_password, Email FROM ".CUSTOMERS_TABLE." WHERE (Login='".xToText($login)."' OR Email='".xToText($login)."') AND (ActivationCode=\"\" OR ActivationCode IS NULL)");
if ($row = db_fetch_row($q)) //send password
{
$password = cryptPasswordDeCrypt( $row["cust_password"], null );
$smarty_mail->assign( "user_pass", $password );
$smarty_mail->assign( "user_login", $row['Login'] );
$html = $smarty_mail->fetch("remind_password.tpl.html");
xMailTxtHTMLDATA($row["Email"], EMAIL_FORGOT_PASSWORD_SUBJECT, $html);
return true;
}
else
return false;
}

  • 2

#2 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 08 April 2013 - 09:50 AM

Немного опоздал с этим дополнением, но в отличие от уже имеющегося на форуме, этот вариант позволяет осуществить плавный переход с авторизации по логину на авторизацию по E-mail. Он позволяет старым пользователям входить как по E-mail, так и по Login. Новые пользователи при регистрации и входе уже будут использовать только почтовый адрес.


В каком отличии? Я по-моему четко и ясно написал что никаких проблем с авторизацией ни для новых ни для старых клиентов НЕТ. Входить смогут как старые со своим логином так и новые по имейлу или любому дополнительному полю, при этом переключать это все можно в админке.
  • 0

#3 Salp

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 218 сообщений
Репутация: 54
Продвинутый

Отправлено 08 April 2013 - 11:52 AM

В каком отличии? Я по-моему четко и ясно написал что никаких проблем с авторизацией ни для новых ни для старых клиентов НЕТ. Входить смогут как старые со своим логином так и новые по имейлу или любому дополнительному полю, при этом переключать это все можно в админке.


Ок, тогда удалите тему.
  • 0

#4 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 08 April 2013 - 11:57 AM

Ок, тогда удалите тему.


Зачем, альтернативное решение всегда хорошо.
Отличие в модулях таки есть. В Вашем модуле логиниться можно И по имейлу И по логину одновременно как я понял. Или я ошибаюсь? В моем логиниться можно только ТАК как зарегистрировался. Т.е. если зарегился по логину то по имейлу не войдешь.
  • 0

#5 Salp

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 218 сообщений
Репутация: 54
Продвинутый

Отправлено 08 April 2013 - 12:04 PM

Да, логиниться можно как по email, так и по login (для корректной работы нужно удалить из базы дубликаты email).
Но регистрироваться новым уже только по email, соответственно login у них равен email.
Добавлено восстановление пароля по email или логин.
Поле Логин вообще убрано из видимости и добавлена проверка на уникальность email при регистрации или редактировании профиля.
  • 0

#6 golftuning

    Пользователь

  • Пользователи
  • PipPip
  • 18 сообщений
Репутация: 0
Начинающий

Отправлено 08 April 2013 - 08:24 PM

Хорошее дополнение.
Кстати, некоторые господа клиенты любят создавать несколько учетных записей, пытаясь скрыть свою отрицательную репутацию в виде неоплаченных или отказных заказов.
Понятное дело, что введя мыло в поиске, мы находим все учетки, но просмотр всех заказов в каждой учетной записи отнимает немало времени.
А тут- все как на ладони, одно мыло- одна учетка.
  • 0

#7 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 09 April 2013 - 06:02 AM

А тут- все как на ладони, одно мыло- одна учетка.

Да ну.... зарегистрирует другое мыло и делов.
Так раньше Вы их вычислить могли, а теперь и вычислить не сможете, потому что мыло другое будет.
  • 0

#8 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 09 April 2013 - 10:24 AM

Кстати, некоторые господа клиенты любят создавать несколько учетных записей, пытаясь скрыть свою отрицательную репутацию в виде неоплаченных или отказных заказов.

А в чем тут отрицательность репутации? Несколько странно сначала создать систему, где можно не оплатить заказ и можно отказаться от заказа, а затем называть клиента, выполнившего эти действия "клиентом с отрицательной репутацией" :).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#9 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 09 April 2013 - 11:43 AM

А в чем тут отрицательность репутации? Несколько странно сначала создать систему, где можно не оплатить заказ и можно отказаться от заказа, а затем называть клиента, выполнившего эти действия "клиентом с отрицательной репутацией"


Ну это стандартная ситуация с наложенными платежами. Человек сделал заказ и не пришел его забирать.
Возможно просто неверно изложен смысл.
  • 0

#10 Jeck2000

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 159 сообщений
Репутация: 8
Начинающий
  • ГородСанкт-Петербург

Отправлено 22 April 2013 - 09:42 AM

А в чем тут отрицательность репутации? Несколько странно сначала создать систему, где можно не оплатить заказ и можно отказаться от заказа, а затем называть клиента, выполнившего эти действия "клиентом с отрицательной репутацией"


Ну это стандартная ситуация с наложенными платежами. Человек сделал заказ и не пришел его забирать.
Возможно просто неверно изложен смысл.


Вот вот, бывает периодически (слава богу редко) просто "Отказ адресата", бывает конкуренты, чтобы мелко напакастить делают заказ и не выкупают его (одного даже вычислил), с чем только уже не сталкивался за много лет работы, да любой магазин всегда ведет черный список клиентов
  • 0