Самый эффективный способ проверить, активировал ли пользователь свою учетную запись? - PullRequest
2 голосов
/ 03 августа 2010

Я хочу, чтобы мои пользователи активировали свои учетные записи, прежде чем они смогут войти в систему. После регистрации им отправляется электронное письмо со ссылкой для активации, примерно так:

http://www.blabla.com/activate.php?email=blabla@blabla.com&token=Aisd23uNMAu53932asdDasd82AS

Конечно, всякий раз, когда кто-то входит в систему, я должен проверять, активировал ли этот пользователь свой аккаунт. Я могу придумать 2 способа решения этой проблемы, либо добавить дополнительный столбец в моей таблице «пользователи», который устанавливается пустым, когда пользователь активирует следующим образом:

-----------------------------------------------
| id | username | password | activation_token |
-----------------------------------------------
| 1  | user1    | blabla   |                  |
-----------------------------------------------
| 2  | user1    | blabla   | asd232DA34qADJs2 |
-----------------------------------------------

Затем я извлекаю маркер Activation_token вместе с пользовательской информацией всякий раз, когда пользователь входит в систему. Или у меня может быть отдельная таблица, содержащая только токены активации, которая затем присоединяется к таблице 'users' каждый раз, когда пользователь входит в систему:

--------------------------------------
| id | account_id | activation_token |
--------------------------------------
| 1  | 37         | dsad2428491dka98 |
--------------------------------------
| 2  | 2          | asd232DA34qADJs2 |
--------------------------------------

Так, какой из них будет наиболее эффективным? Спасибо за ваше время.

РЕДАКТИРОВАТЬ: Спасибо за все замечательные ответы

Ответы [ 8 ]

4 голосов
/ 03 августа 2010

Лично я бы сделал комбинацию из двух ...

-------------------------------------
| id | username | password | status |
-------------------------------------
| 1  | user1    | blabla   | 1      |
-------------------------------------
| 2  | user1    | blabla   | 0      |
-------------------------------------

Где статусом является поле TINYINT(1), которое равно 0 для деактивированных пользователей и 1 для активированных пользователей. Таким образом, вы можете очень быстро определить «статус» пользователя ...

Затем сохраните токен в другой таблице (как у вас уже есть) ... Таким образом, вам не нужно присоединяться или проверять строковый столбец, если учетная запись не активирована ...

1 голос
/ 03 августа 2010

Если токен активации когда-либо используется только для проверки ссылки «нажмите здесь, чтобы активировать учетную запись» и никогда не используется снова, то нет смысла тратить место в вашей пользовательской таблице, хранящей char(32) (или что бы то ни было ) поле для одноразового использования. Поместите токены активации в отдельную таблицу, на которую может ссылаться скрипт активации вашей учетной записи, когда пользователь нажимает для активации. После завершения активации вы можете удалить запись токена из этой отдельной таблицы.

Поместите логическое / битовое поле is_activation в пользовательскую таблицу, которую ваш сценарий входа может проверить в процессе входа в систему (и выдает ошибку «эй, вы еще не активировали», если поле пустое / ложное). 1004 *

Конечно, дисковое пространство в наши дни дешевое. Даже миллион пользователей, каждый с токеном активации 32char, будет «тратить» только 32 мг. Если терабайтный диск стоит менее 100 долларов, это составляет 0,00305% диска, и, по сути, его стоимость составляет 0,00 доллара (0,305 цента).

1 голос
/ 03 августа 2010

Если отношение равно 1-1 (например, в таблице активации будет 1 строка для идентификатора учетной записи), тогда выполнение полностью нормализованного подхода с двумя таблицами является излишним.

У вас не будет серьезных проблем с любым из этих подходов, но с 1 таблицей проще.

Если вы используете подход с двумя таблицами, вы должны хранить «активированный» флаг да / нет в пользовательской таблице, поэтому вам не нужно присоединяться ко второй таблице для входа пользователя в систему.

1 голос
/ 03 августа 2010

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

1 голос
/ 03 августа 2010

Хранение токена в таблице Users, а не в отдельной таблице, означает, что вам не нужно присоединяться к ним во время каждого запроса, что будет немного быстрее.

Также вы не сохраняетеuserIds и создание нового Id для этой таблицы токенов, что позволит сэкономить на хранилище данных.

1 голос
/ 03 августа 2010

Используйте первый вариант - добавьте столбец isactivated в таблицу USERS.

Нет необходимости в отдельной таблице - это отношение один к одному.

0 голосов
/ 04 августа 2010

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

Перед входом в систему проверьте, включен флаг или нет. Если флаг отключен, то пользователь не нажал на ссылку активации. тогда вы можете дать сообщение об ошибке пользователю.

Если флаг установлен, то пользователь может успешно войти в систему.

0 голосов
/ 03 августа 2010

Не думаю, что нужно хранить токен активации в БД.Что-то вроде md5 ('users @ email'. 'Secret') будет работать просто отлично.Что касается статуса пользователя, я согласен с другими, используйте отдельный столбец «статус» в таблице пользователей.Дополнительным преимуществом является то, что в этом столбце могут храниться и другие данные (например, «banned»;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...