MVC Многопользовательская аутентификация / безопасность - PullRequest
1 голос
/ 07 ноября 2011

Я работал над веб-приложением для компании, которая помогает им в цитировании, управлении запасами и выполнении заданий. Мы считаем, что приложение будет полезно для других компаний в отрасли, но я никоим образом не хочу развертывать отдельные экземпляры приложения, поэтому мы делаем его многопользовательским (или многопрофильным может быть более подходящим термином, так как каждая компания имеет несколько пользователей).

Он встроен в Codeigniter (жаль, что я сделал это в Rails, хотя сейчас уже слишком поздно), и я попытался следовать подходу с использованием модели тощего контроллера. Я просто хочу убедиться, что я делаю авторизацию правильно. Когда пользователь входит в систему, я сохраняю идентификатор компании вместе с идентификатором пользователя в сеансе. Я думаю, что каждая таблица, с которой пользователь взаимодействует, должна иметь дополнительное поле companyID (таблицы, к которым косвенный доступ осуществляется через отношения, вероятно, не должны будут хранить тоже companyID, скажите, если я ошибаюсь). Получение данных кажется довольно простым, просто добавьте дополнительное условие where в AR, чтобы добавить идентификатор компании в выборку, например, $this->db->where('companyID', $companyID). Я в порядке с этим.

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

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

Я удивлен, что не смог найти ответ на этот вопрос, я должен искать неправильные термины: с. Но я был бы признателен за любые ответы на эту тему.

Заранее спасибо,

Christian

Ответы [ 3 ]

1 голос
/ 07 ноября 2011

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

Я бы также сказал, что было бы лучше добавить к каждому запросу запрос where (будь то get, update, delete. Однако я не уверен, что вы Я хочу вручную войти и сделать это для всех ваших запросов. Я бы предложил перезаписать эти методы в ваших моделях, чтобы добавить соответствующие предложения where. Таким образом, когда вы вызываете $this->model->get(), вы автоматически получите where->($companyID, $userID) пункт добавлен в запрос.

1 голос
/ 08 ноября 2011

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

Простая аутентификация
В любом случае, лучшая ставка на API, которую я вижу, - это две таблицы: companies и users. в таблице companies есть companyID и password. в таблице users свяжите каждого пользователя с компанией.

Затем, когда пользователь отправляет запрос, он отправляет через companyID и password каждый запрос.

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

Но, на мой взгляд, в целом гораздо удобнее в использовании и немного более безопасен.

0 голосов
/ 07 ноября 2011

Один из способов сделать это - использовать префиксы таблиц. Однако, если у вас уже есть много таблиц, их дублирование, очевидно, быстро увеличит размер БД. Если у вас не много таблиц, это должно масштабироваться. Вы можете установить префикс на основе учетных данных пользователя. См. Раздел префиксов этой страницы: http://codeigniter.com/user_guide/database/queries.html для получения дополнительной информации о работе с ними.

Другой вариант - не развертывать отдельные экземпляры приложения, а использовать отдельные базы данных. Вот сообщение на форуме CI, обсуждающее несколько БД: http://codeigniter.com/forums/viewthread/145901/ Здесь снова вы можете выбрать правильный БД на основе учетных данных пользователя.

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

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