Heim > Artikel > PHP-Framework > Empfehlung zur Laravel-Erweiterung: Rollen- und Berechtigungsverwaltungstool „Bouncer“
Nach Jahren der Entwicklung, 56 Veröffentlichungen, 1,3 Millionen Downloads und über 2800 aktiven Followern ist Bouncer endlich bei Version 1.0 angekommen. Es ist seit geraumer Zeit äußerst zuverlässig und stabil und wird von unzähligen Apps auf der ganzen Welt in der Produktion eingesetzt.
Dies ist ein persönliches Update, das einige meiner Gedanken im Laufe der Jahre enthält – von der Gründung bis zur endgültigen Veröffentlichung. Technische Informationen zur täglichen Verwendung von Bouncer finden Sie in der ausführlichen Dokumentation oder in meiner Diskussion mit Matt Stover im Laravel Podcast. Was ist Bouncer?
Bouncer ist ein Open-Source-Paket zur dynamischen Verwaltung von Rollen und Berechtigungen in einer Datenbank, vollständig integriert in Laravel's Gate
.Einfache FähigkeitenOhne auf Details einzugehen, hier eine kurze Liste einiger seiner Hauptfunktionen:
Bouncer::allow($user)->to('access-dashboard');Modell. Fähigkeiten
Bouncer::allow($user)->to('view', Invoice::class); Bouncer::allow($user)->to('delete', $invoice);Flexibel Rollen
Bouncer::allow('admin')->everything(); Bouncer::assign('admin')->to($user);Verbietende Fähigkeiten
Bouncer::allow($user)->to('view', Invoice::class); Bouncer::forbid($user)->to('view', $confidentialInvoice);Mächtige Eigentümerschaft
Bouncer::allow($user)->toOwn(Post::class);
Bouncer::scope()->to($tenantId);Integriertes Caching
Bouncer::cache();
...und mehr. Weitere Informationen finden Sie in der vollständigen Dokumentation oder stöbern Sie einfach im Spickzettel.
Bereits im August 2015 fügte Taylor in Laravel 5.2 ein neues Autorisierungssystem mit dem Namen Gate. Dies stellt eine nette API zum Definieren von Berechtigungsprüfungen für verschiedene Vorgänge in Ihrer Anwendung bereit, Einfaches define Rückrufe
und vollständige RichtlinienGate
。这提供了一个很好用的 API,用于应用程序中定义各种操作的权限检查,简单 定义
回调 和完整的 policies,以及根据您定义的内容在 整个系统中挂接检查权限。
当我开始使用它时,我就知道这将是所有 Laravel 应用程序的 ACL 的未来。 真是太好了,Taylor 对清晰和直观的 API 有这种惊人的感觉,而「Gate」抽象真正地揭示了这一点。
然而,内置授权系统缺少一件事:动态权限,存储在数据库中。 构建 Gate 的方式,所有检查都由应用程序中定义的硬编码函数执行,因此无法让您的管理员在运行时通过某些仪表板 UI 控制其中任何一个。 正如泰勒的 原始提交 明确指出:
[内置 Gate] 为组织逻辑提供了一种结构,该逻辑授权对实体进行操作。 它没有对「用户角色」的定义做出任何决定。
当时,还有许多其他流行的 ACL 操作系统支持在运行时调整权限,但它们有一个主要缺点:它们都是在 Laravel 的 Gate
, sowie von Ihnen definierte Inhalte werden in die Prüfung eingebunden Berechtigungen
Als ich anfing, dies zu verwenden, wusste ich, dass dies die ACL für alle Laravel-Anwendungen sein würde Zukunft. Es ist großartig, dass Taylor dieses erstaunliche Gespür für klare und intuitive APIs hat, und die „Gate“-Abstraktion zeigt das wirklich.
heißt es eindeutig: [Built-in Gate] bietet eine Struktur zum Organisieren von Logik, die Operationen an Entitäten autorisiert. Es trifft keine Entscheidungen über die Definition von „Benutzerrollen“.
Zu dieser Zeit wurden viele andere beliebte ACL-Betriebssysteme unterstützt Sie haben einen großen Nachteil: Sie wurden vor Laravels Gate
gebaut. Es handelt sich um völlig separate Systeme; wenn Sie sich für deren Verwendung entscheiden, verzichten Sie auf alle Details und die schöne Integration, die Laravel's Gate bietet.
Wir haben einige Verbesserungen an der Gate-Überprüfung in Laravel 5.3 vorgenommen , um sie schlanker und vorhersehbarer zu machen und die Speicherung dieser Funktionen in der Datenbank zu erleichtern.
Der Name „Bouncer“ fiel mir schon sehr früh ein. Die Aufgabe des „Türstehers“ besteht darin, für Sicherheit an der Tür zu sorgen und die Erlaubnis der Personen zu überprüfen. Das ist also eine sehr natürliche Kombination mit „Gate“ in Laravel.
Originallogos
, die er entworfen hat: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);
Wenn Sie den Quellcode von Bouncer erkunden, werden Sie einige Code und Tests finden, in denen ich mit der Implementierung begonnen habe. Es ist noch lange nicht fertig, aber bleiben Sie dran.
Alles in allem steht Bouncer wirklich gut da. Jedes gute Produkt hat eine lange Roadmap und es ist dumm und unrealistisch zu glauben, dass ich das Ende dieses Weges erreichen kann, bevor ich 1.0 veröffentliche.
Okay, das ist es. Ich hoffe, Sie versuchen, Bouncer in Ihren Anwendungen zu verwenden und haben Freude daran. Die API von Bouncer ist wie Prosa konzipiert und jeder Methodenaufruf liest sich wie ein richtiger englischer Satz. Probieren Sie es aus und sagen Sie mir Bescheid, wenn es Ihnen so geht!
【Verwandte Empfehlungen: Laravel-Video-Tutorial】
Das obige ist der detaillierte Inhalt vonEmpfehlung zur Laravel-Erweiterung: Rollen- und Berechtigungsverwaltungstool „Bouncer“. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!