Роли и разрешения в php - PullRequest
       1

Роли и разрешения в php

2 голосов
/ 16 февраля 2020

Я создаю меню, но я хочу ограничить его только некоторыми пользователями с указанным разрешением c.

запрос:

ВЫБЕРИТЕ idpermission, ИД пользователя ИД ИЗ ПОЛЬЗОВАТЕЛЬСКИХ ПОЛОЖЕНИЙ, ГДЕ ИД пользователя ID = "U001"

Результат: пользователь U001 имеет 3 сохраненных разрешения.

idpermission,userid
 IDP001,U001
 IDP002,U001
 IDP003,U001

I есть 3 таблицы (пользователи, разрешения и user_permissions) , в user_permissions Я сохраняю каждое разрешение каждого пользователя

Example:

Table

user | permission | user_permissions

result:

user: u001,carlos,carlos@...

permissions: IDP001 = book | IDP002 = create_book | IDP003 = edit_book | IDP004 = user | IDP005 = edit_user...

user_permissions:
IDP001,U001
IDP002,U001
IDP003,U001
IDP001,U002
IDP003,U002...

при вызове запроса

while($sqlRow=$sqlPermissions->fetch(PDO::FETCH_ASSOC))
 {
   if ($sqlRow['idpermission'] == 'IDP001' || $sqlRow['idpermission'] == 'IDP002' || $sqlRow['idpermission'] == 'IDP003')
     {
        echo "user menu ";
     }
 }

но результат, который мне кажется, равен 3:

user menu user menu user menu

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

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

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

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

Таким образом, все ожидаемые столбцы объявляются, и вы можете использовать простые условные проверки true / falsey в вашем php для любых настроек разрешений.

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

Схема (MySQL v5.7)

CREATE TABLE user_permissions ( 
  idpermission VARCHAR(20),
  userid VARCHAR(20)
);

INSERT INTO user_permissions VALUES
('IDP001', 'U001'),
('IDP002', 'U001'),
('IDP003', 'U001'),
('IDP001', 'U002'),
('IDP003', 'U002');

Запрос № 1

SELECT MAX(IF(idpermission = 'IDP001', 1, 0)) AS book,
       MAX(IF(idpermission = 'IDP002', 1, 0)) AS create_book,
       MAX(IF(idpermission = 'IDP003', 1, 0)) AS edit_book,
       MAX(IF(idpermission = 'IDP004', 1, 0)) AS user,
       MAX(IF(idpermission = 'IDP005', 1, 0)) AS edit_user
FROM user_permissions
WHERE userid = 'U001'
GROUP BY userid;

Результирующий набор:

| book | create_book | edit_book | user | edit_user |
| ---- | ----------- | --------- | ---- | --------- |
| 1    | 1           | 1         | 0    | 0         |

Просмотр на БД Fiddle

0 голосов
/ 16 февраля 2020

Я не уверен, что в вашем вопросе недостаточно информации, или я, возможно, упустил момент.

Ваш пример использует U001 в качестве идентификатора пользователя. while l oop, похоже, правильно отображать три эха «пользовательского меню», поскольку U001 имеет разрешение на просмотр IDP001 , IDP002 и IDP003 .

Если, однако, вы пытаетесь просмотреть U002 , учитывая, что U002 не имеет разрешения на просмотр IDP002 и IDP003, Вы не увидите три эха.

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

$userPermissions = array(
    'book'        => 1,
    'create_book' => 0,
    'edit_book'   => 0
);

$menuItems = array(
    'book' => 'View Booking',
    'create_book' => 'Create Booking',
    'edit_book' => 'Edit Booking'
);

foreach ($menuItems as $key => $value) {

    if ($userPermissions[$key]) {
        echo $value;
    }

}

В приведенном выше сценарии вы можете сохранить $userPermissions как сериализованный в вашей базе данных. Затем, когда это необходимо, получите его из базы данных и с помощью foreach l oop создайте меню, отображая значения $menuItems, если у пользователя есть разрешение на его просмотр.

Ваша таблица (из моего пример) может выглядеть примерно так:

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