Удалить дубликат формы выберите результат - PullRequest
2 голосов
/ 21 сентября 2019

# отредактировано

ОК.Я удалю все разрешения на роли и добавлю их снова.

Можно ли объединить все 4 запроса в один?


Я создаю систему разрешений.

Допущения:

  • Каждый пользователь может иметь более одной роли

  • Каждая роль может иметь более одного разрешения

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

Приоритет разрешений:

  • разрешение роли

  • отказ в роли

  • разрешение пользователя

  • отказано пользователю

Отказ в предоставлении пользователю самого высокого приоритета


Вопрос в PHP довольно прост:

  • Я создаюмассив со всеми разрешениями

  • Я получаю разрешения для роли (порядок доступа)

  • Я назначаю доступ, если он запрещен, яперезаписать доступ с отказом

  • я делаю то же самое для прав пользователя

  • я назначаю доступ, если он запрещен, перезаписываю доступ с отказом

Таким образом, у меня есть весь массив с разрешениями для конкретного пользователя, например, $ user ['missions '] [' delete_post '] // output: false ||true

Мне нужно сделать проверку разрешения сейчас.Это означает, что пользователь имеет доступ к, например, «delete_post»

У меня есть такая структура базы данных: DB structure Здесь скрипка с базой данных: БД скрипка

У меня проблема с первымquery:

**Query #1**
    =============================================
        List of all roles related to permission with id 3   */
    SELECT DISTINCT role_id, access, permission_id FROM role_permissions WHERE permission_id=3 ORDER BY role_id, access DESC;

| role_id | access | permission_id |
| ------- | ------ | ------------- |
| 5       | 0      | 3             |
| 8       | 1      | 3             |
| 10      | 1      | 3             |
| 10      | 0      | 3             |

Как и ожидалось, я должен получить

| role_id | access | permission_id |
| ------- | ------ | ------------- |
| 8       | 1      | 3             |

Я не могу добавить WHERE permission_id=3 AND access=1, потому что я получаю результат: role_id = 8 и role_id = 10, но role_id = 10действительно нет доступа.

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Один из способов - выполнить все соответствующие объединения между различными таблицами на основе их отношений, а затем выполнить фильтрацию на основе агрегации, используя GROUP BY с предложением HAVING.

Следующий запрос даст вам всех пользователей, которым разрешен доступ для данного идентификатора разрешения (более подробное объяснение в комментариях внутри запроса ниже - может потребоваться больше возиться с логикой; при необходимости проверьте и прокомментируйте):

Запрос - Просмотр на скрипте БД

SELECT 
  u.user_id, 
  u.name 
FROM users AS u 
-- Left Join to get access (if defined for input permission id)
LEFT JOIN user_permissions AS up
  ON up.user_id = u.user_id 
     AND up.permission_id = 3 
-- Join to Roles; assuming every user has atleast one role
-- Change this to LEFT JOIN if it is possible that user can have NO role
JOIN user_roles AS ur 
  ON ur.user_id = u.user_id 
-- Left Join to get access defined for input permission id for roles
LEFT JOIN role_permissions AS rp 
  ON rp.role_id = ur.role_id 
     AND rp.permission_id = 3
GROUP BY u.user_id, u.name 
HAVING 
  -- first priority if user specific access allowed
  -- if data is sane then up.access will have same value 
  -- across all rows in a group for user
  MAX(up.access) = 1 

  OR 

  -- second priority is not have a single role with 
  -- denied permission AND 
  -- atleast one role exists with allowed permission
  ( NOT SUM(rp.access = 0) 
    AND 
    SUM(rp.access = 1)
  );

Результат

| user_id | name             |
| ------- | ---------------- |
| 4       | Cyrus Gomez      |
| 7       | MacKensie Morton |
| 13      | Nadine Taylor    |
| 15      | Ezekiel Bonner   |
| 17      | Ciaran Turner    |
| 35      | Olga Dominguez   |
| 38      | Lucas Pierce     |
0 голосов
/ 21 сентября 2019

Вы можете добавить условие WHERE, как показано ниже -

SELECT DISTINCT role_id, access, permission_id 
FROM role_permissions 
WHERE permission_id=3 
AND role_id NOT IN (
    SELECT DISTINCT role_id  
    FROM role_permissions
    WHERE access = 0
    AND permission_id=3  -- New condition added
)
ORDER BY role_id, access DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...