Разрешить только зарегистрированным пользователям видеть внешний HTML-сайт, размещенный на том же сервере и в домене (в подпапке) - PullRequest
0 голосов
/ 03 мая 2018

У меня есть сайт PHP ( сайт A , CakePHP 2.3) с собственной системой входа в систему. Затем у меня есть другой «сайт» (на самом деле это электронная книга, созданная в формате html с собственным index.html) на том же сервере, но в другой папке, назовем его site B .

Я пытаюсь разрешить только пользователям, которые имеют действительный сеанс на сайте A (вошли в систему с действительными учетными данными), просматривать эту книгу (доступ к этому файлу index.html). Основная идея заключается в том, чтобы запретить пользователям прямой доступ к URL-адресу сайта B.

Это было бы легко, если бы я мог проверить сеанс пользователя на сайте A с сайта B, я мог бы просто проверить переменную $ _SESSION, но это невозможно.

Какой самый простой способ сделать это? Хотя это и нежелательно, но все же хорошо, если мне нужно отредактировать этот файл index.html с сайта B, чтобы добавить любой код, который может помочь с этим.

Один из способов, о котором я думал, это сделать перенаправление JavaScript с сайта A на сайт B, который включает POST-переменную , если переменная не существует, то ничего не отображается , Это потребовало бы добавления некоторого php в этот index.html на сайте B, но я не уверен, что это лучшее решение, интересно, есть ли что-нибудь лучше.

Кроме того, у меня есть сотни таких книг, поэтому, если я смогу применить их массово, это будет намного лучше.

EDIT:

Для пояснения, оба сайта находятся на одном сервере и имеют один и тот же "домен". Чтобы открыть сайт B, я использую символическую ссылку с сайта A. Например:

1 Ответ

0 голосов
/ 03 мая 2018

Создать прокси

Я бы использовал .htaccess, чтобы перенаправить любой URL, указывающий на страницы в книге, на пользовательский action в приложении CakePHP.

action проверяет учетные данные, и если все в порядке, считывает с диска фактический запрошенный файл и отправляет его в браузер. Не перенаправляйте назад, иначе вы вызовете цикл перенаправления!

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

Конечно, это не очень эффективно, но работает. Мне пришлось решить ту же проблему в старом проекте.

Примечания

Убедитесь, что ваши правила .htaccess только перехватывают / перенаправляют ссылки HTML, иначе вам следует обратить внимание на настройку правильных заголовков ответов для файлов CSS или изображений.

Пример .htaccess

Это должно быть в папке ROOT книги

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule    ^(.*html)$    http://[FULL_LINK_TO_CAKE_APP]/proxy/load/$1
</IfModule>

Пример прокси-контроллера

namespace App\Controller;

/**
 * Static content controller
 *
 * This controller will render a html file 
 *
 */
class ProxyController extends AppController
{

    public function load($file=null){
        if( !$file ){
            return $this->response->body( "Error: no file specified" );
        }

        //THIS NEEDS TO RESOLVE THE FULL DISK PATH OF YOUR PROTECTED FILES
        $pathToFiles = WWW_ROOT . '/subfolder/';

        if( file_exists( $pathToFiles . $file )){
            $this->response->body( file_get_contents( $pathToFiles.$file) );
            return $this->response;
        }

        $this->response->body('Could not load the file: ' . $pathToFiles . $file);
        return $this->response;
    }
}

Безопасность

Конечно, я предполагаю, что вы правильно настроили компонент Auth в вашем AppController, поэтому вышеприведенный контроллер будет работать, только если пользователь вошел в систему!

...