


Recommandation d'extension Laravel : outil de gestion des rôles et des autorisations 'Bouncer'
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.
Qu'est-ce que Bouncer ?
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');
Copier après la connexion Bouncer::allow($user)->to('view', Invoice::class); Bouncer::allow($user)->to('delete', $invoice);
Copier après la connexion-
Bouncer::allow('admin')->everything(); Bouncer::assign('admin')->to($user);
Copier après la connexion Bouncer::allow($user)->to('view', Invoice::class); Bouncer::forbid($user)->to('view', $confidentialInvoice);
Copier après la connexionBouncer::allow($user)->toOwn(Post::class);
Copier après la connexionBouncer::scope()->to($tenantId);
Copier après la connexionBouncer::cache();
Copier après la connexion
...et plus encore. Pour plus de détails, consultez la documentation complète, ou parcourez simplement la aide-mémoire.
Pensées originales de Bouncer
En août 2015, Taylor en a ajouté un dans Laravel 5.2 Nouveau système d'autorisation, appelé < code>Porte. Cela fournit une API intéressante pour définir des contrôles d'autorisation pour diverses opérations dans votre application, Simple define< /code> 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.Cependant, il manque une chose au système d'autorisation intégré : des autorisations dynamiques, stockées dans une base de données
. De la façon dont Gate est construit, toutes les vérifications sont effectuées par des fonctions codées en dur définies dans l'application, il n'y a donc aucun moyen pour votre administrateur de contrôler l'une d'entre elles au moment de l'exécution via une interface utilisateur de tableau de bord. Comme le dit clairement leengagement 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
Nom et logo du Bouncer
J’ai pensé très tôt au nom « Bouncer ». Le travail du
consiste à 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
技术基础
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);
Copier après la connexion这样,用户就可以查看和编辑所有发票,但不能做其他任何事情。 当然,这现在可以在没有角色的情况下直接完成,但通过角色来完成会提供另一层灵活性。
我已经尝试过多次解决这个问题,但结果非常棘手,因为缓存变成了一场真正的噩梦。 我仍然希望有一天能解决它。 走着瞧。
能力限制。 允许对给定能力进行任意限制将增加更精细的控制:
// 注意:这还没有实现 Bouncer::allow($user) ->to('view', Post::class) ->where('is_confidential', false);
Copier après la connexionSi 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.
Profitez-en !
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

PHP et Python ont chacun leurs propres avantages et choisissent en fonction des exigences du projet. 1.Php convient au développement Web, en particulier pour le développement rapide et la maintenance des sites Web. 2. Python convient à la science des données, à l'apprentissage automatique et à l'intelligence artificielle, avec syntaxe concise et adaptée aux débutants.

Le PHP reste important dans le développement Web moderne, en particulier dans la gestion de contenu et les plateformes de commerce électronique. 1) PHP a un écosystème riche et un fort soutien-cadre, tels que Laravel et Symfony. 2) L'optimisation des performances peut être obtenue via Opcache et Nginx. 3) PHP8.0 introduit le compilateur JIT pour améliorer les performances. 4) Les applications natives dans le cloud sont déployées via Docker et Kubernetes pour améliorer la flexibilité et l'évolutivité.

PHP est un langage de script largement utilisé du côté du serveur, particulièrement adapté au développement Web. 1.Php peut intégrer HTML, traiter les demandes et réponses HTTP et prend en charge une variété de bases de données. 2.PHP est utilisé pour générer du contenu Web dynamique, des données de formulaire de traitement, des bases de données d'accès, etc., avec un support communautaire solide et des ressources open source. 3. PHP est une langue interprétée, et le processus d'exécution comprend l'analyse lexicale, l'analyse grammaticale, la compilation et l'exécution. 4.PHP peut être combiné avec MySQL pour les applications avancées telles que les systèmes d'enregistrement des utilisateurs. 5. Lors du débogage de PHP, vous pouvez utiliser des fonctions telles que error_reportting () et var_dump (). 6. Optimiser le code PHP pour utiliser les mécanismes de mise en cache, optimiser les requêtes de base de données et utiliser des fonctions intégrées. 7

PHP convient au développement Web, en particulier dans le développement rapide et le traitement du contenu dynamique, mais n'est pas bon dans les applications de la science des données et de l'entreprise. Par rapport à Python, PHP présente plus d'avantages dans le développement Web, mais n'est pas aussi bon que Python dans le domaine de la science des données; Par rapport à Java, PHP fonctionne moins bien dans les applications au niveau de l'entreprise, mais est plus flexible dans le développement Web; Par rapport à JavaScript, PHP est plus concis dans le développement back-end, mais n'est pas aussi bon que JavaScript dans le développement frontal.

PHP est toujours dynamique et occupe toujours une position importante dans le domaine de la programmation moderne. 1) La simplicité de PHP et le soutien communautaire puissant le rendent largement utilisé dans le développement Web; 2) sa flexibilité et sa stabilité le rendent exceptionnelle dans la gestion des formulaires Web, des opérations de base de données et du traitement de fichiers; 3) PHP évolue et optimise constamment, adapté aux débutants et aux développeurs expérimentés.

Les raisons pour lesquelles PHP est la pile technologique préférée pour de nombreux sites Web incluent sa facilité d'utilisation, son soutien communautaire solide et son utilisation généralisée. 1) Facile à apprendre et à utiliser, adapté aux débutants. 2) Avoir une énorme communauté de développeurs et des ressources riches. 3) Largement utilisé dans WordPress, Drupal et d'autres plateformes. 4) Intégrez étroitement aux serveurs Web pour simplifier le déploiement du développement.

PHP est utilisé pour créer des sites Web dynamiques, et ses fonctions principales incluent: 1. Générer du contenu dynamique et générer des pages Web en temps réel en se connectant à la base de données; 2. Traiter l'interaction utilisateur et les soumissions de formulaires, vérifier les entrées et répondre aux opérations; 3. Gérer les sessions et l'authentification des utilisateurs pour offrir une expérience personnalisée; 4. Optimiser les performances et suivre les meilleures pratiques pour améliorer l'efficacité et la sécurité du site Web.

PHP et Python ont chacun leurs propres avantages et conviennent à différents scénarios. 1.PHP convient au développement Web et fournit des serveurs Web intégrés et des bibliothèques de fonctions riches. 2. Python convient à la science des données et à l'apprentissage automatique, avec une syntaxe concise et une bibliothèque standard puissante. Lors du choix, il doit être décidé en fonction des exigences du projet.
