(PHP) Проблема с аутентификацией

slmark
Дата: 12.07.2006 10:07:56
У меня есть проблема с аутентификацией пользователя. Вобщем есть 2 файла:
1. Отвечает за уатентификацию (auth.php):
<?php
// тут подключаем бд
// тут проверим переменную, которая будет перенаправлять на
//аутентификацию с других страничек при вводе прямой ссылки 
//ex.: http://site.com?op=add

if(!defined("is_logged_in")) exit(); // тут, кстати, лучше die или exit()

session_start();
      if(!empty($_POST['enter']))
{
         $_SESSION['login'] = $_POST['login'];
         $_SESSION['pass'] = $_POST['pass'];
}

$sql = mysql_query ("select * from Users");
for ($i=0; $i<mysql_num_rows($sql); $i++)
{
        $db_user=mysql_fetch_array($sql);

if(empty($_SESSION['login']) or
         $db_user['user'] != $_SESSION['login'] or
         $db_user['user'] != $_SESSION['pass']){
   ?>
     <form action=index.php method=post>
     Логин <input class=input name=login value="">
     Пароль <input class=input name=pass value="">
     <input type=hidden name=enter value=yes>
     <input class=button type=submit value="Вход">
   <?php
}}
exit(); // тут тот же вопрос: что лучше die или exit()
?>

И файл index.php:
<?php
define("is_logged_in", TRUE);
include "auth.php";

$op = $_GET['op'];
switch ($op)
{
        case '' :  include "add.php";
        case 'add' : include "add.php"; break;
        case 'edit' : include "edit.php"; break;
        case 'delete' : include "delete.php"; break;
}
?>
<!-- тут header -->
<a href="index.php?op=add">add</a>
<a href="index.php?op=edit">edit</a>
<a href="index.php?op=delete">delete</a>
<!-- тут footer -->

И тут вся проблема в том, что юзеров в Table несколько... И смотря где заверщать цикл, мне выдает либо форм столько сколько и строк в таблице,
либо выбирает только 1ю строку... А мне необходимо, чтоб с данными формы сверялись ВСЕ юзеры из таблицы и при положительном результате перенаправлялись на index.php.
Помогите, пожалуйста, осилить. Вдвойне буду вам признателен, если посоветуете какие-нибудь улучшения в коде.
Спасибо!
Robert Tappan Moris
Дата: 12.07.2006 11:25:01
Насчет die() или exit() - все просто можешь использовать то, что больше нравится, т.к. die() является эквивалентом exit() (http://www.php.net/die).

Насчет Вашего кода проверки - я просто ума не приложу что двигало Вами когда вы его писали. Если уж хотите проверку в цикле делать, то лучше делать так:
<?php

if(!defined("is_logged_in")) exit();

session_start();
if(!empty($_POST['enter']))
{
         $_SESSION['login'] = $_POST['login'];
         $_SESSION['pass'] = $_POST['pass'];
}
$found = false;
$login = false;
if (!empty($_SEESION['login'])) {
	$sql = mysql_query ("select * from Users");
	while ($user=mysql_fetch_array($sql)) {
		if ($_SESSION['login']==$db_user['user']) {
			$found = true;
			if ($_SESSION['pass']==$db_user['pass']) {
				$login = true;
			}
			break;
		}
	}
}

if ($login) {
	// авторизация прошла успешно
	// header("Location: index.php");	// перенаправление
	// при использовании в index.php include перенаправление делать не надо.
} else {
	// авторизация не прошла
?>
	<form action=index.php method=post>
	Логин <input class=input name=login value="">
	Пароль <input class=input name=pass value="">
	<input type=hidden name=enter value=yes>
	<input class=button type=submit value="Вход">
<?php
	if ($found) {
		// пользователь найден, но пароль не правильный
	}
	// обрываем сценарий чтоб больше ничего не ушло в браузер
	exit();
}

?>
slmark
Дата: 12.07.2006 12:01:51
Спасибо, но код работать не хочет...
После объявления переменных
$found = false;
$login = false;

я пишу echo ("1");
и ничего не происходит... скрипт как будто останавливатся :(
slmark
Дата: 12.07.2006 12:19:58
предыдущий вопрос снимается...
Но тут получается, что если ты в первый раз ввел логин и пароль неверно, то все - конец... Дальше вооди не вводи - без разницы...
Не подскажете как подправить?
Спасибо!
Robert Tappan Moris
Дата: 12.07.2006 14:15:48
Вообще-то как раз должно быть наоборот. У меня получается что запрос логина и пароля происходит до упора, то есть пока не будет пройдена авторизация.

Кстати вот более аккуратный код. Так же здесь можно проверить работу скрипты без подключения к бд:
<?php

// === из рабочего скрипты нужно это убрать
		$db_user['user'] = "Crash";
		$db_user['pass'] = "666";
// также нужно раскомментировать строки в проверке
// =========================================


//if(!defined("is_logged_in")) exit();

session_start();
$found = false;
$login = false;
if (isset($_POST['login'])&&isset($_POST['pass'])) {
	$frm_login = $_POST['login'];
	$frm_pass = $_POST['pass'];
	//$sql = mysql_query ("select * from Users");
	//while ($db_user=mysql_fetch_array($sql)) {
		if ($frm_login==$db_user['user']) {
			$found = true;
			if ($frm_pass==$db_user['pass']) {
				$login = true;
				$_SESSION['login'] = $frm_login;
				$_SESSION['pass'] = $frm_pass;
			}
			//break;
		}
	//}
}


if ($login) {
	// авторизация прошла успешно
	// header("Location: index.php");	// перенаправление
} else {
	// авторизация не прошла
?>
	<form method=post>
	Логин <input class=input name=login value="">
	Пароль <input class=inputy type=password name=pass value="">
	<input class=button type=submit value="Вход">
<?php
	if ($found) {
		// пользователь найден, но пароль не правильный
		echo "Не правильный пароль";
	}
}

?>
slmark
Дата: 12.07.2006 15:17:11
Огромное спасибо! Авторизация замечательно работает... Но есть еще одна проблемка...
После авторизации пользователь получает доступ с index.php:
<?php
define("is_logged_in", TRUE);

include "auth.php";

if (empty($op)) {
$op='add';
}

switch ($op)
{
        default:  include "add.php"; break;
        case 'add' : include "add.php"; break;
        case 'edit' : include "edit.php"; break;
        case 'delete' : include "delete.php"; break;
}
?>
<a href="index.php?op=edit?op=add">add</a>
<a href="index.php?op=edit">edit</a>
<a href="index.php?op=delete">delete</a>

И вот здесь при нажатии любого линка меня опять выбрасывает на форму ввода логина и пароля. Ведь я определяю переменную define("is_logged_in", TRUE), и условие на проверку этой переменной стоит в начале аутентификации... Помогите, пожалуйста разобраться :(
Спасибо!
Robert Tappan Moris
Дата: 12.07.2006 15:38:27
Замените
if ($login) {
на
if (isset($_SESSION['login'])) {
и выкиньте переменную $login
slmark
Дата: 12.07.2006 16:01:40
Спасибо! Все работает! Надеюсь, я вас не сильно достал? :)
Чуется мне, много у меня еще вопросов будет :)