запрос аутентификации в двух таблицах?

#php #mysql

#php #mysql

Вопрос:

на моем веб-сайте есть отдельные таблицы для пользователей и администратора

теперь я хочу предоставить некоторым пользователям право доступа к области администрирования

моя проблема с таблицей администратора и пользователей

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

что-то вроде этого?

 $sql = "select `password` , `level` from `admin` where `username` = '$username' UNION
(SELECT `password` , `level` FROM `users` where `username` = '$username') LIMIT 1 ";
$result = $db->query($sql);

while($row = mysql_fetch_assoc($result)){
if($password == $row['passwor'] amp;amp; $row['level'] != 0)
echo 'welcom to admin area';
else
echo 'login faild';
}
  

Комментарии:

1. У вас есть ошибки в вашем коде. Сначала вы используете select pasword , а затем $row[‘passwor’] . Будьте осторожны.

2. Есть ли какая-либо причина, по которой вы просто не используете поле в своей таблице users, чтобы указать, имеет ли пользователь права администратора?

3. Вы никогда не должны хранить пароль в открытом виде в базе данных. Для этого используйте соленые хэши. Это особенно важно, потому что хорошо известно, что люди повторно используют пароли, поэтому утечка подобных данных приведет к гораздо большему, чем просто данные на этом сайте.

Ответ №1:

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

Я рекомендую вам изменить макет таблицы.

 table user
-------------
id unsigned integer auto_increment primary key,
username varchar(100) not null,
salt varchar(20) not null,
passhash varchar(48) not null,
isadmin boolean not null default false
  

Запрос вашей таблицы с:

 SELECT u.id, u.isadmin FROM user u
WHERE u.username = '$username' 
  AND passhash = SHA2(CONCAT(u.salt, '$password'),512)
  AND isadmin = 1
  

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

 INSERT INTO user (username, salt, passhash, isadmin) 
   VALUES ('$username', '$salt', SHA2(CONCAT('$salt','$password'),512), '$isadmin')
  

Ответ №2:

Вы можете использовать ЛЕВОЕ СОЕДИНЕНИЕ и не нуждаться в цикле :

     $sql = 'SELECT `a`.`password`, `a`.`level` FROM `admin` AS `a` LEFT JOIN `users` ON `a`.`username` = `u`.`username` WHERE `a`.`username` = "'.$username.'" LIMIT 1';
    $result = $db->query($sql);
    $row = mysql_fetch_assoc($result);

    if($password == $row['passwor'] amp;amp; $row['level'] != 0)
        echo 'welcom to admin area';
    else
        echo 'login faild';
  

Но вы должны создать поле в своей таблице users и использовать int для предоставления таких прав, как :
0 — пользователь, 1 — суперпользователь, 2 модератора и 3 администратора… это пример. Затем вы используете DEFINE в PHP для настройки своего класса. Кроме того, закодируйте свой пароль. Я рекомендую SHA-512.