Après des années de développement, 56 versions, 1,3 million de téléchargements et plus de 2800 abonnés actifs Bouncer est enfin arrivé à la version 1.0. Il est extrêmement fiable et stable depuis un certain temps et est utilisé en production par d’innombrables applications à travers le monde.
Il s'agit d'une mise à jour personnelle contenant certaines de mes réflexions au fil des ans - de la création à la version finale. Pour des informations techniques sur la façon d'utiliser Bouncer au quotidien, consultez la documentation complète ou écoutez ma discussion avec Matt Stover sur The Laravel Podcast.
Avant de commencer mon parcours personnel, voici une brève introduction à ce qu'est Bouncer et comment il s'intègre dans l'écosystème Laravel plus large.
Bouncer est un package open source permettant de gérer dynamiquement les rôles et les autorisations dans une base de données, entièrement intégré à Laravel's Gate.
Sans entrer dans les détails, voici une courte liste de certaines de ses principales caractéristiques :
Bouncer::allow($user)->to('access-dashboard');
Bouncer::allow($user)->to('view', Invoice::class); Bouncer::allow($user)->to('delete', $invoice);
Bouncer::allow('admin')->everything(); Bouncer::assign('admin')->to($user);
Bouncer::allow($user)->to('view', Invoice::class); Bouncer::forbid($user)->to('view', $confidentialInvoice);
Bouncer::allow($user)->toOwn(Post::class);
Bouncer::scope()->to($tenantId);
Bouncer::cache();
...et plus encore. Pour plus de détails, consultez la documentation complète, ou parcourez simplement la aide-mémoire.
En août 2015, Taylor en a ajouté un dans Laravel 5.2 Nouveau système d'autorisation, appelé Porte. Cela fournit une API intéressante pour définir des contrôles d'autorisation pour diverses opérations dans votre application, Simple define rappels<code>Gate
。这提供了一个很好用的 API,用于应用程序中定义各种操作的权限检查,简单 定义
回调 和完整的 policies,以及根据您定义的内容在 整个系统中挂接检查权限。
当我开始使用它时,我就知道这将是所有 Laravel 应用程序的 ACL 的未来。 真是太好了,Taylor 对清晰和直观的 API 有这种惊人的感觉,而「Gate」抽象真正地揭示了这一点。
然而,内置授权系统缺少一件事:动态权限,存储在数据库中。 构建 Gate 的方式,所有检查都由应用程序中定义的硬编码函数执行,因此无法让您的管理员在运行时通过某些仪表板 UI 控制其中任何一个。 正如泰勒的 原始提交 明确指出:
[内置 Gate] 为组织逻辑提供了一种结构,该逻辑授权对实体进行操作。 它没有对「用户角色」的定义做出任何决定。
当时,还有许多其他流行的 ACL 操作系统支持在运行时调整权限,但它们有一个主要缺点:它们都是在 Laravel 的 Gate
et politiques
dans tout le système. Quand j'ai commencé à l'utiliser, je savais que ce serait l'ACL pour toutes les applications Laravel
avenir. C'est génial que Taylor ait cette sensation incroyable pour les API claires et intuitives, et l'abstraction "Gate" le révèle vraiment.engagement original de Taylor :
[Built-in Gate] fournit une structure pour organiser la logique qui autorise les opérations sur les entités. Il ne prend aucune décision sur la définition des « rôles d'utilisateur ».À l'époque, de nombreux autres ACL systèmes d'exploitation populaires étaient pris en charge. Ils ont un inconvénient majeur : ils ont été construits avant le
Gate
de Laravel. Ce sont des systèmes complètement séparés ; si vous décidez de les utiliser, vous abandonnez tous les détails et la belle intégration fournie par la porte de Laravel. J'ai donc décidé de créer un package open source qui vous offre le meilleur des deux mondes : des autorisations dynamiques basées sur une base de données, entièrement intégrées à la porte de Laravel. Nous avons apporté quelques améliorations à la vérification des portes dans Laravel 5.3
pour la rendre plus simple et prévisible, facilitant ainsi le stockage de ces fonctions dans la base de données.Nom et logo du Bouncer
J’ai pensé très tôt au nom « Bouncer ». Le travail du
Bouncerconsiste à assurer la sécurité à la porte et à vérifier les autorisations des personnes. C'est donc une association très naturelle avec "Gate" dans Laravel.
Ce qui est drôle, c'est que le créateur de logo avec lequel je travaillais à l'époque (qui n'était pas anglophone) n'a pas obtenu la référence. Voici quelques logos originaux
qu'il a conçus : 🎜🎜🎜Les deux à droite sont évidemment inspirés par l'action rebondissante. 🎜🎜Après avoir rapidement clarifié la signification du mot garde du corps, nous avons commencé à itérer sur le véritable logo du garde du corps. Nous avons essayé des videurs amicaux, des videurs menaçants, des videurs barbus, des videurs à mâchoire carrée et des tonnes de variantes différentes. En voici quelques-uns : 🎜🎜🎜🎜🎜 J'adore ce avec quoi nous avons fini : 🎜🎜🎜🎜🎜 Il dégage un fort sentiment de sécurité, mais sa rondeur le rend plus convivial et moins menaçant 🎜Bouncer's 的存在理由是与 Laravel 的 gate 无缝集成的。为了实现这一点,我心中的只有一个目标:在为用户分配角色和能力时,您只需和 Bouncer
进行交互。对于实际的授权检查,整个系统中 Laravel 的钩子应该自动工作,而不需任何特殊的 Bouncer 语法。ically, without any special Bouncer syntax.
将 Bouncer 挂钩到 Laravel 的 gate 检查方式是相当简单的。Gate
让你定义 一个全局的 before
回调,它将会在任何您定义的检查之前被调用:如果您的 before
回调允许或不许与某个操作,则不会运行进一步检查。
虽然 before
回调最初是为 「允许管理员执行所有操作」之类的东西而设计的,但我立即意识到这将是连接动态检查的理想场所,允许我查询数据库以获得任何权限。这就是它最初的工作方式(我们后来将其切换为使用 after
回调 - 你可以阅读更多关于 在此线程)
从一开始,文档对我来说就非常重要。 开源项目的生死取决于他们的文档,所以我希望 Bouncer 的文档尽可能做到最好。尤其是在 Laravel 生态系统中,Taylor 为细致的文档设定了极高的标准。
在某种程度上,清晰的文档有时甚至比代码本身更重要。如果不告诉你的用户如何使用你的工具,他们中很少有人会使用源代码来解决这个问题。他们只会继续做下一件事。
我将 Bouncer 的成功很大程度上归功于清晰的文档,但在这方面还有很多工作要做。作为创建者,对整个谜题有一个清晰的了解,很容易忘记刚接触该工具的人会遇到什么困难。
例如:如前所述,Bouncer 仅用于为用户分配角色和权限。实际的授权检查将像在任何标准 Laravel 应用程序中一样处理。所以我想我不必重复所有这些,因为 Laravel 文档中清楚地概述了它。尽管如此,我仍然看到人们为此苦苦挣扎。他们设置了自己的角色和权限,然后不知道从哪里开始。这是我仍然想在文档中充实的一个领域。
将 1.0 版本推迟到现在对我的用户造成了伤害。 Bouncer 多年来一直很稳定,并在世界各地的生产中积极使用。 然而,我总是犹豫要不要发布它,因为我知道我想添加的东西太多了。 我在 播客 上与 Matt 详细讨论了这个问题:我掉进了想要在发布之前让它变得完美的陷阱,这显然是 不可能的。 正如伏尔泰 已警告:「完美是良好的敌人」。
因此,当我发布 Bouncer 1.0 版时,我仍然希望在初始版本中包含 2 个出色的功能,但没有成功:
每个模型的角色。 很长一段时间以来,人们一直在吵着要一种方法,只为给定的模型(或模型类)分配角色给用户。 这是该代码的样子:
// 注意:这还没有实现 Bouncer::allow('editor')->to(['view', 'edit'])->everything(); Bouncer::assign('editor')->to($user)->for(Invoice:class);
这样,用户就可以查看和编辑所有发票,但不能做其他任何事情。 当然,这现在可以在没有角色的情况下直接完成,但通过角色来完成会提供另一层灵活性。
我已经尝试过多次解决这个问题,但结果非常棘手,因为缓存变成了一场真正的噩梦。 我仍然希望有一天能解决它。 走着瞧。
能力限制。 允许对给定能力进行任意限制将增加更精细的控制:
// 注意:这还没有实现 Bouncer::allow($user) ->to('view', Post::class) ->where('is_confidential', false);
Si vous explorez le code source de Bouncer, vous trouverez des code et des tests où j'ai commencé à l'implémenter. C'est loin d'être terminé, mais restez à l'écoute.
Dans l’ensemble, Bouncer est dans une très bonne position. Tout bon produit a une longue feuille de route, et il est insensé et irréaliste de penser que je peux arriver au bout de cette route avant de sortir la version 1.0.
D'accord, c'est tout. J'espère que vous essayerez d'utiliser Bouncer dans vos applications et que vous apprécierez son utilisation. L'API de Bouncer est conçue pour ressembler à de la prose, et chaque appel de méthode se lit comme une phrase anglaise appropriée. Essayez-le et faites-moi savoir si vous ressentez cela !
【Recommandation associée : tutoriel vidéo laravel】
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!