Обработка нескольких учетных записей и пользователей в одном приложении CakePHP с помощью URL domain.com/account/controller/action - PullRequest
0 голосов
/ 12 февраля 2010

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

Соглашение об URL должно быть следующим: domain.com/account/controller/action

Таким образом, ВСЕ контроллеры имеют префикс имени компании / учетной записи.

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

Вопрос в том, как мне это реализовать? Я думал о реализации некоторого вида переписывания htaccess, где я удаляю первый параметр URL (account) и передаю его в качестве параметра строки запроса, который будет внутренне проанализирован app_controller. Проблема, однако, заключается в поддержании целостности со всеми ссылками в приложении. То есть маршрутизация тортов должна была каким-то образом знать параметр учетной записи и передавать его всем выводимым ссылкам.

Кто-нибудь делал что-то подобное раньше?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2010

Вы можете сделать две вещи, обе с Маршрутами.

Во-первых, установка переменной в маршрутах:

Router::connect('/:user/blog/*', array('controller' => 'blogs', 'action' => 'index'));

И теперь вы можете получить доступ к пользовательской переменной с помощью $this->params['user']. Дело в том, что вам придется вручную устанавливать каждый контроллер и действие, которым вы хотите управлять. Я думаю, что в этом нет ничего особенного, поскольку в большинстве случаев лучше переписать архитектуру маршрутов по умолчанию для CakePHP.

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

Router::connect('/(.*)/*', array('controller' => 'blogs', 'action' => 'index'));

В вашем контроллере:

function index($a, $b){
    pr($a);
    pr($b);
}

А теперь вы получите оба варианта.

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

Надеюсь, это помогло.

0 голосов
/ 13 февраля 2010

Совершенно возможно сделать это (но я никогда не делал это).

Я предполагаю, что вы используете стандартную схему аутентификации CakePHP. В этом случае информацию о текущем вошедшем в систему пользователе можно найти в массиве Auth-> User.

Cake ожидает, что в вашей базе данных есть таблица пользователей. Вы должны изменить свои модели, чтобы они имели отношение ownTo с пользовательской таблицей (т. Е. Все таблицы имеют поле user_id).

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

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

Расширение вашего примера:

Запросы пользователей /someController/someAction.

someAction:

if($this->someModel->someOperation(someArgument)) {

   //OK, show view

} else {

   // Something went wrong
   // Your afterFind method provides a clue via the model->failure attribute

   $this->flash($this->someModel->failure);

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