具有Laravel权限的Vue.js

Kap*_*rdi 3 user-permissions laravel vue.js

我正在将Laravel Permission API与Vue.JS前端集成。我正在使用https://github.com/spatie/laravel-permission库获取Laravel权限。我不明白如何在Vue JS前端中检查权限(在Laravel刀片中,我使用@Can来检查权限)。

Ism*_*oev 5

我确实在做同样的事情。我正在考虑添加一个自定义 Vue 指令来检查 Laravel.permissions 数组。

它甚至可能像

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

我还没有测试过这段代码。只是在这里集思广益。

<button v-can="editStuff">You can edit this thing</button>
Run Code Online (Sandbox Code Playgroud)

我可以这样持有权限:

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

  • 我想你会想要设置一个端点,你可以从 vue 前端点击它会给你用户权限,否则,在上面的例子中,是什么阻止用户编辑他们的权限并获得访问权限一切。 (4认同)
  • 我猜你只会使用 `&lt;script type="text/javascript"&gt; window.Laravel = { permissions: Json.parse('@json(\Auth::user()-&gt;permissions)') };&lt;/ script&gt;` 刀片模板中的某处(很可能是 `layout.blade.php`)。 (2认同)
  • @wheelmaker 这无关紧要,因为需要许可的所有内容仍将位于端点之后,仅用于前端布局 (2认同)

Shu*_*uyi 5

我将执行ajax调用来检查权限,类似这样,但是您需要修改它以满足您的需求。

路线:

Route::get('/permission/{permissionName}', 'PermissionController@check');
Run Code Online (Sandbox Code Playgroud)

控制器:

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

Vue :(如果您想同步执行此操作),这是一个简单示例(Vue全局混合),您可以将其转换为Vue指令或组件。

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

Run Code Online (Sandbox Code Playgroud)

然后,每次您想要检查权限时,您都可以

<el-input v-if="can('write-stuff')"> </el-input>
Run Code Online (Sandbox Code Playgroud)

  • 想象一下页面上有 100 个按钮。然后您进入页面... Boom 100 axios 获取请求。我认为这是一个不好的做法。 (7认同)