#php #laravel #roles
Вопрос:
Поэтому в настоящее время я разрабатываю веб-приложения, которые будут иметь управление пользователями и управление ролями (роли с использованием разрешения spatie/laravel). у него много ролей, например:
- Root (суперадминистратор)
- Администратор Даера(на основе деревни)
- административный блок (в зависимости от его рабочего места/подразделения)
- Kepala Badan
- Kepala seksi
- Персонал
- Гражданин
- И т.д.
Каждый пользователь может (и будет) иметь более одной роли, например, пользователь с ролями [«администратор даэра», «персонал» и «гражданин»].
Я хочу создать функцию, в которой каждый раз, когда пользователь входит в систему и имеет более одной роли, он будет перенаправлен на страницу, на которой отображаются его списки ролей, и он выберет одну из ролей. после того, как он выберет роль, она будет перенаправлена на панель мониторинга и будет иметь разрешение только на основе выбранной роли (например, он выбрал роль «Персонал», поэтому он может делать только «вещи», которые разрешены в качестве персонала).
Я уже нахожусь на StackOverflow и спрашиваю на другом форуме, но я все еще не могу найти свои решения, и я все еще новичок в laravel. Я надеюсь, что кто-нибудь сможет дать какое-то решение и логику того, как это сделать. Спасибо
Правка 1: поскольку я использую разрешение spatie/laravel,у него уже есть model_has_roles
таблица в качестве основы.. таким образом, он будет содержать role_id
, role_name
, guard_name
, model_id as user_id
, внешний ключ unit_id
, внешний ключ institution_id
, is_active
Комментарии:
1. Как вы записываете несколько ролей, которые пользователь может иметь в вашей базе данных? Например, есть ли у вас
role_1
role_2
role_3
столбцы , , в таблице пользователей? Или у вас есть как бы отдельныйroles_per_user
столик?2. поскольку я использую spatie, у него уже есть
model_has_roles
таблица в качестве основы.. таким образом, он будет содержатьrole_id
,role_name
,guard_name
,model_id
и т.д. Примечание: model_id = идентификатор пользователя3. Не совсем знаком с spatie, но есть ли в
model_has_roles
таблицеuser_id
столбец?4. Да, model_id =идентификатор пользователя.. так что это в основном то же самое, только с другим именем столбца
5. Опубликовал ответ, который вы, возможно, захотите попробовать. Надеюсь, это поможет.
Ответ №1:
Проверьте это таким образом:
- Создайте
role_ids(text)
строку вusers
таблице. Сохраните роли пользователей в этой строке с помощьюimplode()
метода. (пример: 1,4,3,6) - При входе пользователя в систему проверьте это
role_ids
, если существует более 1 роли , попросите выбрать одну из них. - После выбора обновите роль пользователя в spatie.
Но не забывайте, что когда вы будете обновлять роль пользователя через панель администрирования, вы должны обновлять ее не в таблице ролей spatie, а role_ids
в users
таблице in. в противном случае пользователь может получить доступ к другим ролям, если он уже вошел в систему.
Комментарии:
1. Я уже изменил свою правку , чтобы она содержала все столбцы из
model_has_role
, потому что в каждой строке есть данныеunit_id
иinstitution_id
, поэтому я думаю, что если использование ваших способов повлияет на многие другие мои функции, заставьте меня изменить много кода и потребуется много времени, чтобы исправить это. так что, может быть, я сначала попытаюсь найти другие способы, прежде чем испробовать ваш совет.. кстати, спасибо
Ответ №2:
Вы можете попробовать такой подход:
Как только пользователь вошел в систему, включите запрос ниже, прежде чем перенаправлять пользователя на предполагаемое представление.
Экс.
$userRoles = ModelHasRole::where('user_id', '=', Auth::User()-gt;id)-gt;get(); return view ('select_role_page', compact('userRoles'))
Затем в файле блейда select_role_page
@foreach ($userRoles as $indiv_userRole) @if ($indiv_userRole-gt;role_name == 'admin') lt;a href="role/admin"gt;Link to Admin Dashboardlt;/agt; @endif @if ($indiv_userRole-gt;role_name == 'staff') lt;a href="role/staff"gt;Link to staff Dashboardlt;/agt; @endif @if ($indiv_userRole-gt;role_name == 'citizen') lt;a href="role/citizen"gt;Link to Citizen Dashboardlt;/agt; @endif @endforeach
Если у пользователя есть какая-либо из ролей, указанных выше, будет показана соответствующая ссылка.
ПРАВКА: Убедитесь, что у вас есть маршрут для ссылок выше, как показано ниже.
Route::get('/role/{id}', 'RoleController@showDashboard');
И в вашем контроллере.
public function showDashboard ($id) { if ($id == 'admin') { return view ('admindashboard'); } if ($id == 'staff') { return view ('staffdashboard'); } if ($id == 'citizen') { return view ('citizendashboard'); } }
Комментарии:
1. Я думал об этом раньше, но есть несколько вещей, которые меня беспокоят… во-первых, я не знаю, куда я поместил запрос/код, прежде чем он перенаправился на панель мониторинга/предполагаемое представление. во-вторых, у меня есть меню на боковой панели, и потому что я использую шаблон для своего проекта, поэтому ему требуется дополнительная конфигурация для обработки некоторой динамической панели мониторинга в зависимости от роли (я подумаю об этом позже). третий,
2. Вы можете вставить запрос в
AuthenticatesUsers.php
файл, который можно найти вvendorlaraveluiauth-backend
. Вставьте запрос внутрьprotected function authenticated (Request $request, $user) { // Insert it here }
3. допустим, я использую твой способ… как ограничить некоторые функции в файлах блейда и на контроллере? например, как проверить
selected role
? потому что я думаю, что я буду реализовывать некоторый код, основанный наselected role
4. Я имею в виду реализацию некоторых условий , основанных
selected role
, например: еслиselected role
это персонал, то он будет делатьthis
, но еслиselected role
это гражданин, он ничего не будет делать5. С кодом блейда ссылка «гражданин» в любом случае не будет отображаться, если у пользователя нет роли гражданина. Если у пользователя есть
staff
роль, то он или она сможет нажать наstaff link
нее и быть перенаправленным, скажем,/staff
на . Просто убедитесь, что вы создали/staff
маршрут, который вызывает функцию, содержащую нужную вам логику.