2015-02-10 6 views
1

Я работаю над довольно сложной системой пользователей, которая требует предоставления привилегий доступа отдельным лицам или целым группам. Например, вы можете предоставить Jane Doe доступ к умеренной доске сообщений или всем пользователям Группы связи для отправки электронных писем, умеренной доске сообщений и публикации событий (всем пользователям, назначенным группе, предоставляется доступ к этим привилегиям при добавлении) ,Laravel 5 Eloquent ORM - от многих до многих от многих до многих

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

В принципе, я хочу что-то вроде этого:

// 1 = Message Board Moderator 
// See if any of the user's groups contain this privilege - 
$hasAccess = Auth::user()->groups->privileges->contains(1); 

Вот моя структура таблицы:

Пользователи

| Field   | Type    | Null | Key | Default    | Extra   | 
+----------------+------------------+------+-----+---------------------+----------------+ 
| id    | int(10) unsigned | NO | PRI | NULL    | auto_increment | 
| username  | varchar(80)  | NO |  | NULL    |    | 
| email   | varchar(120)  | NO |  | NULL    |    | 
| first_name  | varchar(20)  | NO | MUL | NULL    |    | 
| last_name  | varchar(45)  | NO | MUL | NULL    |    | 
| password  | varchar(140)  | NO |  | NULL    |    | 
| active   | tinyint(1)  | NO |  | NULL    |    | 
| remember_token | varchar(100)  | NO |  | NULL    |    | 
| last_login  | timestamp  | YES |  | NULL    |    | 
| last_login_ip | varchar(45)  | YES |  | NULL    |    |     
| updated_at  | timestamp  | NO |  | 0000-00-00 00:00:00 |    | 
| created_at  | timestamp  | NO |  | 0000-00-00 00:00:00 |    | 
| deleted_at  | timestamp  | YES |  | NULL    |    | 
+----------------+------------------+------+-----+---------------------+----------------+ 

Группы (таблица: user_groups)

+-------------+------------------+------+-----+---------------------+----------------+ 
| Field  | Type    | Null | Key | Default    | Extra   | 
+-------------+------------------+------+-----+---------------------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL    | auto_increment | 
| name  | varchar(255)  | NO |  | NULL    |    | 
| slug  | varchar(255)  | NO |  | NULL    |    | 
| description | text    | NO |  | NULL    |    | 
| created_at | timestamp  | NO |  | 0000-00-00 00:00:00 |    | 
| updated_at | timestamp  | NO |  | 0000-00-00 00:00:00 |    | 
+-------------+------------------+------+-----+---------------------+----------------+ 

Группа пользователи Pivot (таблица: user_user_group)

+---------------+------------------+------+-----+---------+-------+ 
| Field   | Type    | Null | Key | Default | Extra | 
+---------------+------------------+------+-----+---------+-------+ 
| user_id  | int(10) unsigned | NO | MUL | NULL |  | 
| user_group_id | int(10) unsigned | NO | MUL | NULL |  | 
+---------------+------------------+------+-----+---------+-------+ 

привилегии (таблица: privleges)

+-------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+-------+------------------+------+-----+---------+----------------+ 
| id | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| name | varchar(255)  | NO |  | NULL |    | 
| slug | varchar(255)  | NO |  | NULL |    | 
+-------+------------------+------+-----+---------+----------------+ 

привилегии Группа пользователя Pivot (таблица: privilege_user_group)

+---------------+------------------+------+-----+---------+-------+ 
| Field   | Type    | Null | Key | Default | Extra | 
+---------------+------------------+------+-----+---------+-------+ 
| privilege_id | int(10) unsigned | NO | MUL | NULL |  | 
| user_group_id | int(10) unsigned | NO | MUL | NULL |  | 
+---------------+------------------+------+-----+---------+-------+ 
+0

Что вы хотите сказать? Это простая система ролей/разрешений, но я не знаю, о чем вы просите. – Sturm

+0

Думал, что я был довольно ясен, но вот еще один способ сказать это. Пользователь может принадлежать многим группам. Группа может иметь много Привилегий. Мне нужно выяснить, принадлежит ли конкретный пользователь группе, имеющей определенный Привилегию, у Группы может быть много Привилегий. Итак, «Доступен ли этот пользователь к этой Привилегии через одну из их групп, если таковая имеется?» – NightMICU

ответ

0

Был разочарован тем, что здесь никто не звонил, но, к счастью, мне удалось найти отличную помощь на Laracasts.com.

Я пошел с Zizaco/entrust, что делает именно то, что я описывал. Единственная недостающая часть - это ответ на вопрос: «У этого пользователя есть разрешение», если пользователь не назначен группе, но это легко выполнить с помощью Eloquent. Какая поручение отвечает на вопрос «Доступ ли у этого пользователя к этому разрешению через группу?» И это то, чем я был.

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