如何在 SPA 中处理角色/权限(Laravel+Vue)

Posted

技术标签:

【中文标题】如何在 SPA 中处理角色/权限(Laravel+Vue)【英文标题】:How to handle roles/permissions in an SPA (Laravel+Vue) 【发布时间】:2019-01-03 05:27:50 【问题描述】:

我听到了很多关于 SPA 的讨论,所以我想让我们试一试,于是我开始使用 Laravel+Vue 开展一个 SPA 项目。

我开始在 axios 和 vue-router 的帮助下制作一些 CRUD。一切都很顺利,直到我需要授权用户并根据他们的角色做出决定。我意识到现在我没有服务器端渲染(刀片指令)的优势,我必须在 vue 端工作来管理角色/权限等。但我不知道我该如何处理。 .. 最佳做法是什么... 是否有任何需要注意的问题... 等等等等。

所以我开始了我的研究,我从here、there 和there 收集到的信息是,我必须将数据存储在 JS 对象或 localStorage 中才能执行以下操作:

<p v-if="Laravel.user.role == 'admin'"> Confidential Data </p>

<p v-else> Unimportant Information </p>

但是如果实际上不是管理员而是版主的用户在控制台中执行了这个Laravel.user.role.push('admin') 怎么办?那些敏感数据不会暴露给他吗?

localStorage 也可用:localStorage.getItem('user.role')

那么处理这种情况的安全/标准/最常见的方法是什么?

【问题讨论】:

在服务器端验证权限,只返回授权数据。 @emix 假设我有 3 个选项卡:主页、配置文件、操作,并且我希望操作选项卡仅对授权用户可见,如何才能在服务器端验证一个选项卡,因为我有已经渲染了所有的标签? @Eisenheim 问题是&lt;p v-if="Laravel.user.role == 'admin'"&gt; Confidential Data &lt;/p&gt; 将被编译成javascript,因此每个用户只要努力就可以看到它,您应该在获取来自 api 端点的“机密数据”只有管理员可以访问 好的,我明白你的意思了。但是只发送授权数据将是一场噩梦。你能用我之前提到的“标签类比”来指导我吗?如果你被要求隐藏一个选项卡项或菜单项,你会如何隐藏它? @Tanmay 什么最终最适合你? 【参考方案1】:

我认为最好的方法是在 Vuex 中存储数据,如果你使用 store 或者你可以使用原型并使用 Vue.prototype.$userPerms = axios.get() 并且你将能够在每个组件中使用 this.$userPerms .

但保护数据的最佳方式是 API 无法返回用户无法看到的数据。因此,如果有人以某种方式破解他的角色。他仍然看不到数据,因为 API 没有返回数据。

【讨论】:

【参考方案2】:

在 Laravel 中控制数据访问,然后在前端使用 @casl 执行一些额外的基于权限的逻辑。

npm install @casl/vue @casl/ability

包:

https://www.npmjs.com/package/@casl/vue

https://www.npmjs.com/package/@casl/ability

示例应用:

https://github.com/stalniy/casl-vue-api-example

教程:

https://vuejsdevelopers.com/2018/01/08/vue-js-roles-permissions-casl/

【讨论】:

以上是关于如何在 SPA 中处理角色/权限(Laravel+Vue)的主要内容,如果未能解决你的问题,请参考以下文章

laravel-如何在 5.1 中使用 zizaco 获得具有所有角色和所有权限的用户?

如何在 laravel spatie 中分配多个角色和基于多个角色的权限?

我如何在 laravel 中为 spatie 包(ACL 管理)中的其他角色分配用户列表权限?

如何在登录具有 Spatie 的 Laravel 权限的用户之前检查用户角色?

如何使用 Laravel Sanctum 处理 SPA 和基于令牌的身份验证

Laravel 角色和权限操作