Как сделать вход пользователя в качестве функций роли?

#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:

Проверьте это таким образом:

  1. Создайте role_ids(text) строку в users таблице. Сохраните роли пользователей в этой строке с помощью implode() метода. (пример: 1,4,3,6)
  2. При входе пользователя в систему проверьте это role_ids , если существует более 1 роли , попросите выбрать одну из них.
  3. После выбора обновите роль пользователя в 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 маршрут, который вызывает функцию, содержащую нужную вам логику.