2012-04-26 3 views
1

Я новичок в php и в настоящее время создаю сайт для электронной коммерции. Я создал сервер CMS для администратора, чтобы добавлять/редактировать/удалять продукты, управлять заказами, управлять конфигурацией магазина и добавлять/редактировать/удалять пользователей.Уровни доступа пользователей на PHP

У меня возникли проблемы с поиском, как установить права доступа пользователей/права доступа таким образом, чтобы: - Общие сотрудники имеют доступ только к управлению заказами и - управления персоналом имеют доступ ко всему

Поэтому в основном предоставляя пользователям роль что даст им ограничения или полный доступ ко всему.

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

Любая помощь будет принята с благодарностью. Спасибо

+0

Вы используете фреймворк, такой как Zend или Symfony, или просто собственный собственный php-код? Если вы правильно кодируете, как выглядит ваша структура кода/класса? – Tom

+0

Ссылка http://en.wikipedia.org/wiki/Access_control_list и пример реализации в Zend Framework http://framework.zend.com/manual/en/zend.acl.introduction.html –

+0

Ну, на данный момент у меня есть только реализовал ваш стандартный пользовательский доступ. Эти пользователи находятся в базе данных и имеют доступ ко всему. В настоящее время я изучаю это, чтобы получить лучшее понимание: http://en.wikipedia.org/wiki/Role-based_access_control – JUM

ответ

1

Права связаны с Ролями, а пользователи связаны с Ролями. Хотя есть, несомненно, много способов реализовать этот тип системы, что далее следует быстрое понятие, из которого вы могли бы начать думать:

Users: 
    + userid 
    + roleid /* Associate a Role to a User */ 

Roles: 
    + roleid 
    + rolename 

Permissions: 
    + permissionid 
    + permissionname 

RolePermissions: 
    + roleid 
    + permissionid /* Associate a Permission to a Role */ 

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

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

if ($user->allowed('deleteUser')) { 
    $users->remove($uid); 
} 

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

1

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

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

<?php if ($_SESSION['logged_user_profile'] == 'manager'): ?> 
<!-- display your thing here --> 
<?php endif; ?> 

Обратите внимание, что это только скрыть элементы. Вам нужно будет выполнить эту проверку повсюду в вашем коде, чтобы предотвратить выполнение соответствующих действий ...

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

Ну, это сложный вопрос, который сильно зависит от архитектуры вашего проекта, так извините, если это не правильно ответит на ваш вопрос.

+0

Hey Gaet, я думаю, что это то, что я ищу. Есть только 2 профиля, как указано. Это действительно может мне помочь. благодаря – JUM

2

Альтернативный дизайн, что предполагает @Johnathan бы user HAS_MANY roles и каждый role HAS_MANY permissions.

Users: 
    + id 
    + name 

Roles: 
    + id 
    + name 

Permissions: 
    + id 
    + name 

Затем связать пользователей к каждой из своих ролей, (и ролей для каждого из них прав), например:

RolesUsers: 
    + id 
    + role_id /* Associate a Role to a User */ 
    + user_id /* Associate a User to a Role */ 

RolePermissions: 
    + id 
    + role_id  /* Associate a Role to a Permission */ 
    + permission_id /* Associate a Permission to a Role */ 

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

1

Расширение от структуры Джонатана, я сделал несколько изменений:

Users: 
    + userid 
    + roleid /* Associate a Role to a User */ 

Roles: 
    + roleid 
    + rolename 
    + roleinherit /* Added this field */ 

Permissions: 
    + permissionid 
    + permissionname 

RolePermissions: 
    + roleid 
    + permissionid /* Associate a Permission to a Role */ 

Будучи в состоянии наследовать от других ролей, действительно может помочь упростить управление доступом. Например, можно сказать, что роль «модератор» наследует «пользовательскую» роль, которая наследует роль «гость». Таким образом, у вас никогда не будет гостя, который может делать то, что не может сделать модератор.

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

function getPermissions($roleID) { 
    // get info about this role and store it in $permissions. Assume we also set $inheritFrom 
    if ($inheritFrom == 0) return $permissions; 
    else return array_merge($permissions, getPermissions($inheritFrom)); 
} 

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

Смежные вопросы