Как добавить роли и разрешения в Laravel Fortify + Inertia + vue?

мой проект использует laravel fortify, inertia с vue. Мне нужно добавить разрешения на основе ролей (как и пакет пространственных разрешений). Я еще новичок в подкреплении и инерции. но у меня есть опыт работы с пространственным пакетом. Я застрял в том, как добавлять роли и разрешение на укрепление. в настоящее время я планирую создать структуру таблицы, такую ​​как пакет spatie (роли, разрешения, роли_хас_пермиссии и т. д.). есть ли пакет для каждой сборки или лучший способ реализовать роли и разрешения? и использовать @can в файлах vue? Спасибо.

изменить

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

1) установлен и настроен как обычно spatie / laravel-permission

2) добавлены предопределенные разрешения и роли в таблицы с помощью сидера

  1. создана функция в пользовательской модели для получения списка массивов разрешений

    // user model function
    public function getPermissionArray()
     {
         return $this->getAllPermissions()->mapWithKeys(function($pr){
             return [$pr['name'] => true];
         });
    
     }
    
  2. и добавил эту функцию в промежуточное ПО инерции

//App\Http\Middleware\HandleInertiaRequests
public function share(Request $request)
{
     return array_merge(parent::share($request), [
          'auth'=>['user' => $request->user() ?   $request->user()->only('id', 'name', 'email') : null,
                    'can' =>$request->user() ? $request->user()->getPermissionArray() : []
                ],
        ]);
}

теперь $page.props.auth.can может получить глобальный доступ

  1. добавлена ​​проверка разрешений в файле vue
   <div class="row">
              <div class="col-sm-12 col-md-6" v-if="$page.props.auth.can['user_create']">
                <inertia-link
                  class="btn btn-primary"
                  :href="$route('admin.user.create')"
                  >Create New
                </inertia-link>
              </div>
   </div>

person Viduranga    schedule 24.11.2020    source источник
comment
Думаю, эта документация может дать вам подсказку inertiajs.com/authorization   -  person tirta keniten    schedule 24.11.2020
comment
Вау, спасибо. так можно ли использовать тот же пакет spattie и внедрить его функцию в эту функцию 'can'?   -  person Viduranga    schedule 24.11.2020
comment
Я никогда не использую пакет spattie для авторизации, мне вполне достаточно авторизации laravel.   -  person tirta keniten    schedule 25.11.2020
comment
Я пробовал использовать инерционное промежуточное ПО. выглядит работающим. но не знаю, насколько он надежен с точки зрения производительности. (я добавил это выше)   -  person Viduranga    schedule 25.11.2020


Ответы (1)


Я решил проблему, как показано ниже, сначала я отправляю массив разрешений в пользовательский интерфейс.

в пользовательской модели

<?php
    // user model function
    public function getPermissionArray()
     {
         return $this->getAllPermissions()->mapWithKeys(function($pr){
             return [$pr['name'] => true];
         });
    
     }

по инерции поделиться промежуточным ПО

<?php
//App\Http\Middleware\HandleInertiaRequests
public function share(Request $request)
{
     return array_merge(parent::share($request), [
          'auth'=>['user' => $request->user() ?   $request->user()->only('id', 'name', 'email') : null,
                    'can' =>$request->user() ? $request->user()->getPermissionArray() : []
                ],
        ]);
}

в файле app js я добавил глобальную функцию, чтобы проверить, есть ли у одного или нескольких прав пользователя

import Vue from 'vue'


Vue.mixin({
  methods: {
    hasAnyPermission: function (permissions) {

      var allPermissions = this.$page.props.auth.can;
      var hasPermission = false;
      permissions.forEach(function(item){
        if(allPermissions[item]) hasPermission = true;     
      });
      return hasPermission;
    },
  },
})

в компонентах vue:

<script>
       
   export default {
       data() {
            return {};
       },
      mounted: function () {},
      methods: {},
   };
</script>
        
<template>
      <div>  
          <li v-if="hasAnyPermission(['testiml_view', 'testiml_edit', 'testiml_create'])">
              <inertia-link
                :href="$route('admin.testimonial.index')"
                class="side-nav-link-a-ref"
              >
                <i class="fas fa-feather"></i>
                <span>Testimonial</span>
              </inertia-link>
            </li>
</div>
</template>
person Viduranga    schedule 11.04.2021