Интернет, компьютеры, софт и прочий Hi-Tech

Подписаться через RSS2Email.ru

Реализация файловой системы WebDAV с помощью PHP и SabreDAV. Часть 5

Автор: Квентин Зерваас (Quentin Zervaas), 29 марта 2010.

Блокировка

Сервер WebDAV, который мы создали выше, не поддерживает блокировку файлов. Последняя используется клиентами WebDAV (такими как Windows или OS X), чтобы избежать ситуации, когда одни клиенты изменяют или удаляют файлы, когда другие пытаются в них что-то писать.

Если вы используете Mac OS X, вы вообще не сможете что либо записать на ваш WebDAV, пока он не заблокирует файл (он будет доступен в режиме только для чтения).

Чтобы обойти это, мы должны использовать плагин для блокировки файлов, который поставляется с SabreDAV. Он называется Sabre_DAV_Locks_Plugin.

При его инстанцировании необходимо задать объект backend. Этот объект указывает, как хранится блокировка. SabreDAV может хранить данные о блокировках как в файловой системе, так и в базе данных.

Замечание: бакенд базы данных поддерживает только PDO. Если вы хотите хранить данные о блокировках в базе данных, но не хотите использовать PDO, то создайте собственное расширение класса Sabre_DAV_Locks_Backend_Abstract.

В качестве бакенда мы будем использовать файловую систему. Вы можете указать расположение временной директории (доступной на запись), для хранения данных о блокировках. Если вы опустите этот аргумент, SabreDAV найдет ее сам.

Замечание: как и в случае фильтра временных файлов, вы сами должны периодически очищать эту директорию.

Следующий листинг демонстрирует, как инстанцировать бакенд блокировки и задавать его плагину блокировки.

Листинг 7. Добавляем блокировку файлов с помощью стандартного плагина:

<?php
    require_once('Sabre.autoload.php');
 
    $path = '/var/www/dav/files';
 
    $tree = new Sabre_DAV_ObjectTree(
        new Sabre_DAV_FS_Directory($path)
    );
 
    $server = new Sabre_DAV_Server($tree);
 
    $backend = new Sabre_DAV_Locks_Backend_FS();
 
    $server->addPlugin(
        new Sabre_DAV_Locks_Plugin($backend)
    );
 
    $server->exec();
?>

Теперь ваш сервер WebDAV поддерживает блокировку. Это значит, что вы можете использовать его как диск своего компьютера! Попробуйте скопировать файл со своего компьютера на диск WebDAV. Затем переименуйте его, переместите или удалите.

Осталась только одна проблема. Ваш диск открыт для использования кем угодно. Далее мы рассмотрим добавление аутентификации к вашему веб-диску.

Аутентификация

Последним шагом в создании нашего сервера WebDAV станет добавление аутентификации. SabreDAV облегчает добавление как базовой, так и дайджест HTTP аутентификации.

Однако заметим, что пользователи Windows могут использовать базовую аутентификацию только на защищенном сервере. Другими словами, не-SSL сервера WebDAV должны либо не использовать аутентификацию, либо использовать дайджест-аутентификацию.

Раз так, я покажу вам только добавление дайджест-аутентификации. Если вы хотите реализовать базовую аутентификацию, читайте статью «Настройка аутентификации в SabreDAV».

Как работает дайджест

Когда пользователь аутентифицируется посредством дайджеста, он шлет только свое имя и хэш своего пароля. Его настоящий пароль никогда не передается по проводам.

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

В данной статье мы будем полагать, что имя области вашего сервера есть web-dav-server. Это имя не является секретным и может быть легко обнаружено при попытке коннекта к защищенному ресурсу.

Когда мы сохраняем пользовательскую информацию, мы сохраняем имя пользователя и MD5-хэш от этого имени, имени области и пароля пользователя. Так, если имя пользователя есть quentin, имя области — web-dav-server, а пароль — mypass, то хэш может быть вычислен как показано ниже.

Листинг 8. Генерация хэша дайджест-аутентификации с помощью PHP:

<?php
    $username = 'quentin';
    $password = 'mypass';
    $realm    = 'web-dav-server';
 
    $hash = md5($username . ':' . $realm . ':' . $password);
?>

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

Замечание: это также означает, что вы не можете изменить имя пользователя, не сбросив его хэш. Вам придется обновить его пароль.

Аутентификация с помощью SabreDAV

В SabreDAV для аутентификации мы используем класс Sabre_HTTP_DigestAuth. Код аутентификации должен предшествовать созданию сервера WebDAV и обработке запроса.

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

Это демонстрирует следующий код. Он оперирует двумя функциями (user_exists() и get_user_hash()), которые вы должны заменить своими собственными реализациями.

Листинг 9. Аутентификация по запросу с помощью дайджест-класса SabreDAV:

<?php
    require_once('Sabre.autoload.php');
 
    $realm = 'webdavserver';
 
    $auth = new Sabre_HTTP_DigestAuth();
    $auth->setRealm($realm);
    $auth->init();
 
    $username = $auth->getUsername();
 
    if (!user_exists($username)) {
        $auth->requireLogin();
        echo "Authentication required";
        exit;
    }
 
    $hash = get_user_hash($username);
 
    if (!$auth->validateA1($hash)) {
        $auth->requireLogin();
        echo "Authentication required";
        exit;
    }
 
    // правильный юзер, обрабатываем его WebDAV-запрос
?>

После задания области и получения хэша мы вызываем метод validateA1() для проверки этой аутентификационной информации. Если хэш является неправильным, мы вызываем requireLogin() для выполнения запроса аутентификации посредством Sabre_HTTP_DigestAuth.

Замечание: если вы добавили это в скрипт и заходите на него с помощью браузера, его начальная попытка загрузить страницу заканчивается неудачей из-за метода requireLogin(). После этого ваш браузер спрашивает у вас логин и пароль и пытается загрузить страницу снова.

Перевод с английского: Дмитрий Скоробогатов, специально для xBB.uz, 27.01.2014
Оригинальный текст может быть найден по адресу http://www.phpriot.com/articles/web-dav-with-php


Предыдущие публикации:

Биржа долевых инвестиций SIMEX.

Последнее редактирование: 2014-02-21 04:24:16

Метки материала: webdav, файловая система, php, система webdav, sabredav, реализации webdav, веб, сервер webdav, файлы, библиотека sabredav, web

Оставьте, пожалуйста, свой комментарий к публикации

Представиться как     Антибот:
   

Просьба не постить мусор. Если вы хотите потестить xBB, воспользуйтесь кнопкой предварительного просмотра на панели инструментов xBBEditor-а.


© 2007-2017, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.