Единое окно входа в систему как для администратора, так и для пользователей - PullRequest
1 голос
/ 03 апреля 2012

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

Я использую следующий код, но думаю, что это неправильный способ сделатьэто ...

<form action="" method="post">
<input type="text" name="id"/>
<input type="password" name="pswd"/>
<input type="Submit" name="submit" value="Submit"/>
</form>

<?php
if(isset($_POST['submit']) {
 ob_start();
 $id=$_POST['id'];
 $pswd=$_POST['pswd'];

 $sql="SELECT * FROM admin WHERE id=........."
 $query=mysql_query($sql);
 $count=mysql_num_rows($query);
 if($count==1) {
  header('location: admin/index.php');
 } else {
  $sql="SELECT * FROM user WHERE id=........."
  $query=mysql_query($sql);
  $count=mysql_num_rows($query);
  if($count==1) {
   header('location: user/index.php');
  } else {
  echo 'Invalid id-password combination';
 }
}
}
?>

Ответы [ 4 ]

1 голос
/ 03 апреля 2012

Вы можете сократить его одним запросом, если это то, что вам нужно.

<form action="" method="post">
..........
</form>

<?php

    if( isset($_POST['submit'] ) ) {
        $result = mysql_fetch_array( "SELECT user.*, \"user\" as t FROM user WHERE id=".$_POST['id']." UNION SELECT admin.*, \"admin\" as t WHERE id=".$_POST['id']." FROM admin" );
        if( is_array( $result) ) foreach( $result as $i ) {
            if( $i['id']==$_POST['id'] && $i['passwd']==$_POST['passwd'] ) {
                // also here you should set cookie to be checked in user/index.php and admin/index.php to prevent user to get into admin space by directly typing the url
                if( $i['t']=="admin" ) {
                    header('location: admin/index.php');
                } else {
                    header('location: user/index.php');
                }
            }
        }
    } 
    echo( "Invalid id-password combination" );

?>
0 голосов
/ 03 апреля 2012

Сначала вы должны проверить данные $_POST, полученные от пользователя. Вы не знаете, хочет ли кто-то связываться с вашей БД (для получения дополнительной информации читайте здесь: http://php.net/manual/de/security.database.sql-injection.php).

Убедившись, что введенные данные не являются вредоносными, вы можете отправить запрос в свою БД. Я предполагаю, что вы открыли правильное соединение с вашей MySQL-БД ?! Если это так, первый звонок
$query = mysql_query($sql); вместо $query=mysql_fetch_array($sql);.

Далее вы должны установить информацию о состоянии входа пользователя в сеанс. Если вы этого не сделаете, вы не можете определить, вошел ли пользователь в систему или нет.

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

0 голосов
/ 03 апреля 2012

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

Поэтому, когда вы отправляете свой логин, код проверяет что-то вроде этого:

// $db is your mysql connection
$user = array();
if (isset($_POST) && !empty($_POST)) {
 $sql = "SELECT id, level FROM users WHERE username='".mysql_real_escape_string($_POST['username'])."' AND password=MD5('".mysql_real_escape_string($_POST['password'])."'";
 $rs = mysql_query($sql, $db);
 if (mysql_num_rows($rs)>0) {
  $user['username'] = $_POST['username'];
  $user['login_time'] = time();
  // user found, let's see his rights
  while ($row = mysql_fetch_assoc($rs)) {
   $rights = $row['level'];
   $user['id'] = $row['id']; // keep the id for references
   if ($rights = 0) {
     $user['admin'] = true; // is admin
   } else {
     $user['admin'] = false; // is normal user
   }
  }
  // user array is now full of the data we want, so put it in a session, cookie
  // or anything else and then go to login area or whatever.
  header("location: /login-area.php");
 } else { 
   header("location: /user-login-failed.php"); // Send him to a user not found page
 }
} else {
  // The post here is empty. Someone is trying to do something or something went really 
  // wrong. It's up to you.
}
0 голосов
/ 03 апреля 2012

Это тоже будет работать, однако вам нужно следовать некоторому соглашению, например, идентификатор пользователя admin должен начинаться с admin, скажем, admin_XXX, и пользователь не может использовать admin в своем идентификаторе пользователя, и, таким образом, вы можете фильтровать их во время проверки.Форма входа

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