Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Авторизация на PHP


Автор: OutlawZ 17.10.2009, 08:27
Помогите понять общий принцип разработки авторизации для админки, дело в том что я использую всегда для админки аутентификацию Apache и вот хотел просто сделать, вход в админку с помощью PHP без аутентификации, то есть в папке /adm/ лежат скрипты index.php, edit.php
и суть такая что мол когда я к папке обращаюсь выводится форма мол введите логин и пароль и только тогда будет доступен edit.php ну вот тока я не могу понять принцип реализации.
Т.е это что получается, что в edit.php придется подключать index.php и проверять функцию ввода логина и пароля? Хотя примерно понятно как быть с этим, а вот скажем в папке adm лежат другие файлы то как к ним я могу доступ заблокировать не авторизированым админам? т.е с при помощи apache аутентификации пока не пройдешь авторизацию хрен получишь доступ к папке и файлам в ней.

Как это можно сделать без Apache? 
Использовать .htaccess???
Выставить chmod на папку????

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

Автор: youri 17.10.2009, 08:49
http://ru.wikipedia.org/wiki/Авторизация
http://ru.wikipedia.org/wiki/Аутентификация

Автор: Ипатьев 17.10.2009, 09:59
Цитата(OutlawZ @  17.10.2009,  08:27 Найти цитируемый пост)
Как это можно сделать без Apache? 
Использовать .htaccess???

очень смешной вопрос. 
.htaccess - это конфигурационный файл Апача.

Цитата(OutlawZ @  17.10.2009,  08:27 Найти цитируемый пост)
в папке adm лежат другие файлы 

другие - это какие? .php или еще какие-то?

Автор: sdukshis 17.10.2009, 18:39
Наиболее удобный, на мой взгляд, способ авторизации - это использование механизма сессий.

Автор: OutlawZ 17.10.2009, 19:40
Цитата(Ипатьев @  17.10.2009,  09:59 Найти цитируемый пост)
Цитата(OutlawZ @  17.10.2009,  08:27 Найти цитируемый пост)
Как это можно сделать без Apache? 
Использовать .htaccess???

очень смешной вопрос. 
.htaccess - это конфигурационный файл Апача.


Я имел в виду  что в .htaccess прописать запрет на просмотр фалов в папке, т.е можно к примеру запретить просматривать файлы с расширением .tpl и тогда далее.

Цитата(Ипатьев @  17.10.2009,  09:59 Найти цитируемый пост)
Цитата(OutlawZ @  17.10.2009,  08:27 Найти цитируемый пост)
в папке adm лежат другие файлы 

другие - это какие? .php или еще какие-то? 


Да еще файлы, от банального .css до скажем каких нить текстовых файлов 

Автор: Ипатьев 18.10.2009, 17:16
Авторизация к запрету просмотра файлов отношения не имеет.
Авторизация не запрещает, а регулирует доступ. 

Обычно никто не запаривается по поводу css в админке. И ограничиваются авторизацией только для php файлов. 
Если хочется сделать парольный доступ ко всему содержимому папки, то самое простое - это аутентификацию Apache для папки через .htaccess
читать про authname и далее


Автор: OutlawZ 25.10.2009, 23:00
Привет, попробовал по совету сделать авторизацию с помощью сесии, но у меня проблема большая так как я не когда не делал данного кода.

Код файла auth.php
Код

 include("config.php"); #Подключаю файл для связи с бд
 session_start();          #Начинаем сессию
 db_connect();             #Связь с БД
 $query = "SELECT * FROM user";    #Запрос к базе
 $result = mysql_query($query) or die (mysql_error()); 
 
 $logged = 0; #Переменная доступа

if(isset($_POST['aut']))
{
 
 $_SESSION['username'] = $_POST['user'];
 $_SESSION['password'] = md5($_POST['pass']);
}

Получаем из БД пароли и логины 
 while($shell = mysql_fetch_array($result))
 { 
  if(($_SESSION['username'] == $shell[login]) and ( $_SESSION['password'] === $shell[password]))
  {
   $logged = 1; #Если все правильно то ставим 1
  }else{
   $logged = 0; #Если нет то стоим на месте
  } 
 }

#Если 0 то выводим форму авторизации 
if($logged == 0){
 print("<caption>Авторизация:</caption>
        <form method='post'>
        <table border='0' width='20%'>
        <tr><td>Login:</td><td><input type='text' name='user'></td></tr>
        <tr><td>Password:</td><td><input type='password' name='pass'></td></tr>
        </table>
        <input type='submit' name='aut' value='Авторизация'>
        </form>
       ");
}
 

Я понимаю что код страшный но с чего то начинать надо, но это еще не все, вот:

index.php
Код

include("auth.php"); #Подключаем файл с авторизации
 
 if(!$logged == 1) die; #Если не были авторизированы то убить и вывести форму с авторизации

#Если все хорошо то вывести форму регистрации
 print("<caption>Регистрация:</caption>
        <form method='post'>
        <table width='20%'>
        <tr><td>Login:</td><td><input type='text' name='login'></td></tr>
        <tr><td>Password:</td><td><input type='password' name='paswd'></td></tr>
        </table>
        <input type='submit' name='reg' value='Регистрация'>
        </form>
       ");
       
Добавить нового пользователя:
 if(isset($_POST['reg']))
 {
  $sh = md5($_POST['paswd']);
  $query = "INSERT INTO user(login,password) VALUES ('$_POST[login]','$sh')";
  mysql_query($query) or die (mysql_error());
  print("Пользователь добавлен!");
 }


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

Это черновой вариант я конечно не проверяю пока переменные на символы и т.д но я это все сделаю когда с механизм отлажу. 

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

Автор: Bishop 26.10.2009, 01:16
OutlawZ, код чудовищный.
Код

include("config.php");
session_start();

function logged() {
   return (bool)$_SESSION['logged'];
}

$msg = '';
if (isset($_POST['aut'])) {
   db_connect();
   $query = "SELECT * FROM user WHERE login='{$_POST['user']}' LIMIT 1";
   $result = mysql_query($query) or die (mysql_error());
   if (mysql_num_rows($result) == 0) {
      $msg = 'User not found';
   } else {
      $shell = mysql_fetch_array($result);
      $_SESSION['logged'] = $shell['password'] == md5($_POST['pass']);
      if (!logged())
         $msg = 'Incorrect password';
   }
}

if (!logged()) {
   if ($msg)
      print $msg;
   print "<caption>Авторизация:</caption>
      <form method='post'>
      <table border='0' width='20%'>
      <tr><td>Login:</td><td><input type='text' name='user'></td></tr>
      <tr><td>Password:</td><td><input type='password' name='pass'></td></tr>
      </table>
      <input type='submit' name='aut' value='Авторизация'>
      </form>";
}


Чтобы посмотреть на свою ошибку, замените участок проверки в своем коде на:
Код
while ($shell = mysql_fetch_array($result)) { 
  if(($_SESSION['username'] == $shell[login]) and ( $_SESSION['password'] === $shell[password])) {
    print '> login';
  } else {
    print '< logout';
  }
}
die;

Автор: OutlawZ 26.10.2009, 01:59
Елы палы вот прожестил, Bishop спасибо! Мда Фленова читать не буду

Автор: LSIchip 6.11.2009, 00:05
у меня тут тоже вопрос с регистрацией возник, правда немного другого рода)
вот код для проверки существования пользователя на сервере. если такой логи уже есть, то выводится ошибка. но работает всё это дело не так как нужно. ошибка вылазиет даже тогда когда пользователя нету. что делать?
Код

$result = mysql_query("SELECT id FROM users WHERE login='$login'");
$myrow = mysql_fetch_array($result);
if (!empty($myrow['id'])) 
{
    die('{status:0,txt:"User already exists"}');
}


Автор: youri 6.11.2009, 02:54
отлаживать: var_dump($my_row)
p.s. http://phpfaq.ru/slashes

Добавлено через 1 минуту и 12 секунд
p.p.s. пожалуй лучше SELECT COUNT(id)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)