Vue.js с разрешением Laravel

Я нахожусь в процессе интеграции Laravel Permission API с интерфейсом Vue.JS. Я использую библиотеку https://github.com/spatie/laravel-permission для Laravel Permission. Я не понимаю, как я могу проверить разрешение во внешнем интерфейсе Vue JS (в лезвии Laravel я использую @Can для проверки разрешения).

Я тоже столкнулся с той же проблемой.

Tejas Khutale 15.11.2018 06:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
8
1
12 368
5

Ответы 5

Я буквально работаю над тем же самым. Я думаю о добавлении настраиваемая директива Vue, который будет проверять массив Laravel.permissions.

Это может быть даже так просто, как

 Vue.directive('can', function (el, binding) {
  return Laravel.permissions.indexOf(binding) !== -1;
})

Я не тестировал этот код. Просто мозговой штурм здесь.

<button v-can = "editStuff">You can edit this thing</button>

Я могу удерживать разрешения таким образом:

window.Laravel = <?php echo json_encode([
                'csrfToken' => csrf_token(),
                'userId' => Auth::user()->id,
                'permissions' => Auth::user()->permissions()->pluck('name')->toArray()
            ]); ?>

Как получить массив разрешений laravel во vue js?

Tejas Khutale 15.11.2018 06:56

Думаю, вы бы просто использовали <script type = "text/javascript"> window.Laravel = { permissions: Json.parse('@json(\Auth::user()->permissions)') };</script> где-нибудь в шаблоне лезвия (скорее всего, layout.blade.php).

Namoshek 08.02.2019 11:22

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

wheelmaker 11.02.2019 18:40

@wheelmaker это не имеет значения, поскольку все, что требует разрешения, все равно будет находиться за конечной точкой, это только для макета внешнего интерфейса

Michael Mano 11.02.2019 22:36

это безопасный способ использования?

Zia 11.02.2021 06:38

Вместо этого я сделаю вызов ajax для проверки разрешений, что-то вроде этого, но, конечно, вам нужно изменить его, чтобы удовлетворить ваши потребности.

Маршруты:

Route::get('/permission/{permissionName}', 'PermissionController@check');

Контроллер:

function check($permissionName) {
   if (! Auth::user()->hasPermissionTo($permissionName)) {
        abort(403);
   }
   return response('', 204);
}

Vue: (если вы хотите сделать это синхронно), это простой пример (глобальный миксин Vue), вы можете превратить его в директиву или компонент Vue.

Vue.mixin("can", (permissionName) => {
    let hasAccess;
    axios.get(`/permission/${permissionName}`)
        .then(()=> {
            hasAccess = true;
        }
        .catch(()=> {
            hasAccess = false;
        };
    return hasAccess;
});

И затем каждый раз, когда вы хотите проверить разрешение, вы можете просто сделать

<el-input v-if = "can('write-stuff')"> </el-input>

Представьте, что у вас на странице 100 кнопок. И вы заходите на страницу ... Бум 100 аксиомов получают запросы. Я считаю это плохой практикой.

Ivan Davletshin 28.01.2020 13:58

@IvanDavletshin Это правда, но в этом случае вы должны просто поместить v-if в общий div, содержащий эти 100 кнопок

Shuyi 25.02.2020 00:30

Но это работает, только если v-if одинаковы для всех кнопок. И это можно как-то кэшировать, чтобы иметь возможность размещать кнопки, а не только в одном div. Но что, если способность должна отличаться от кнопки к кнопке. Сейчас я внедряю канканоподобную интеграцию в Laravel и Vue. Так что у них обоих будут одинаковые правила. Мне это кажется более правильным.

Ivan Davletshin 26.02.2020 04:12

Привет, Шуйи, как скрыть элемент, если к нему нет доступа?

asela daskon 28.09.2020 09:06

Это не сработает, поскольку запрос на получение является асинхронной операцией. Возврат hasAccess просто вернет undefined. Если вы используете async / await в миксине, он просто вернет Promise вместо разрешения.

Amir Asyraf 09.05.2021 11:47

Просто наткнулся на эту проблему и хотел бы поделиться тем, что нашел и реализовал.

  1. Добавьте аксессор в модель пользователя, которую использует разрешение spatie / laravel
    public function getAllPermissionsAttribute() {
       $permissions = [];
         foreach (Permission::all() as $permission) {
           if (Auth::user()->can($permission->name)) {
             $permissions[] = $permission->name;
           }
         }
       return $permissions;
    }
  1. На вашей глобальной странице или странице макета передайте разрешение от средства доступа к javascript.
    <script type = "text/javascript">
       @auth
          window.Permissions = {!! json_encode(Auth::user()->allPermissions, true) !!};
       @else
          window.Permissions = [];
       @endauth
    </script>
  1. Создайте глобальную директиву для ресурсов / js / app.js
    Vue.directive('can', function (el, binding, vnode) {

        if (Permissions.indexOf(binding.value) !== -1){
           return vnode.elm.hidden = false;
        }else{
           return vnode.elm.hidden = true;
        }
    })

Здесь вы проверяете, находится ли разрешение, которое вы предоставили для директивы, в массиве разрешений из laravel. Если он найден, он скроет элемент else show, эта функция похожа на v-if.

  1. Используйте это в своем компоненте так: "add_items" - это ваше разрешение.
    <button type = "button" v-can = "'add_items'"></button>

Это решение от это, но вместо миксина я использую директиву. Понял идею директивы из комментария @Ismoil Shifoev выше.

Вы можете использовать этот формат в Vuejs для Laravel Permission:

<div v-if = "can('edit post')">
  <!-- Edit post form -->
</div>

<div v-if = "is('super-admin')">
  <!-- Show admin tools -->
</div>

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

class User extends Authenticatable
{
    // ...

    public function jsPermissions()
    {
        return json_encode([
                'roles' => $this->getRoleNames(),
                'permissions' => $this->getAllPermissions()->pluck('name'),
            ]);
    }
}

передать эти данные в JavaScript в заголовке HTML:

<script type = "text/javascript">
    window.Laravel = {
        csrfToken: "{{ csrf_token() }}",
        jsPermissions: {!! auth()->check()?auth()->user()->jsPermissions():null !!}
    }
</script>

в файле app.js добавьте глобальную функцию Vuejs может для проверки прав пользователей и функцию является для проверки ролей пользователей:

Vue.prototype.can = function(value){
    return window.Laravel.jsPermissions.permissions.includes(value);
}
Vue.prototype.is = function(value){
    return window.Laravel.jsPermissions.roles.includes(value);
}

https://github.com/ahmedsaoud31/laravel-permission-to-vuejs

Я бы выбрал раствор Ральфа. Но я считаю, что лучше использую. Эта функция для получения разрешений.

public function getAllPermissionsAttribute() {
    return Auth::user()->getAllPermissions()->pluck('name');
}

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

Другие вопросы по теме