Во-первых, я бы посмотрел, можете ли вы использовать другую систему аутентификации, такую как Google или Facebook, или Open ID (StackOverflow использует их и другие).
Во-вторых, я бы посмотрел на использование системы безопасностифреймворк, такой как Spring Security .
Наконец, если вы хотите / хотите сделать это самостоятельно с нуля, вот несколько указателей
- Всегда храните пароли, используяодносторонний механизм хеширования, например, SHA
- Используйте salt при хешировании вашего пароля - у вас должно быть случайное значение соли для пароля (см. этот вопрос SO для его длины)
- Вы также можете иметь постоянное значение соли для всего приложения, которое не сохраняется рядом с паролем
- Дайте пользователям роли.Это решит проблему ваших пользователей переднего плана / конечных пользователей
Я предполагаю, что вы используете базу данных.Вот пример схемы (MySQL)
CREATE TABLE users (
id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT
mail VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL,
enc_password VARCHARCHAR(64) NOT NULL,
salt CHAR(8) NOT NULL,
is_mail_authenticated TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
UNIQUE KEY (mail)
) ENGINE = InnoDB;
CREATE TABLE roles (
id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT
name VARCHAR(32) NOT NULL,
UNIQUE KEY (name)
) ENGINE = InnoDB;
CREATE TABLE users_roles (
user_id NTEGER UNSIGNED NOT NULL,
role_id NTEGER UNSIGNED NOT NULL,
FOREIGN KEY (user_id) REFERENCES users (id),
FOREIGN KEY (roel_id) REFERENCES roles (id),
) ENGINE = InnoDB;
Это будет сделано для очень простой пользовательской модели.Вам понадобится инструмент для генерации соли.Я бы использовал randomAlphanumeric от Apache commons lang.
Вы можете захотеть добавить некоторые вещи для блокировки учетных записей пользователей после слишком большого количества неудачных попыток входа в систему.И вы можете отслеживать IP-адрес, с которого они вошли в систему.Это оставлено читателю в качестве упражнения:)
Я добавил поле is_mail_authenticated, чтобы отслеживать, аутентифицировал ли пользователь свою почту.Обычно это достигается путем нажатия на ссылку в электронном письме.