經過多年開發,56 次發布,130 萬下載,並且超過 2800 的主動關注 Bouncer 終於來到了 1.0 版本。在相當長的一段時間裡,它一直非常可靠和穩定,並被世界各地無數的 app 用於生產。
這是我個人的更新,包含了我多年來的一些思考 —— 從最初到最終發行。關於如何每天使用 Bouncer 的技術信息,請查看 the extensive documentation 或在 The Laravel Podcast 聽我和馬特・斯托弗討論。
##在開始我的個人旅程之前,這裡先簡單介紹Bouncer 是什麼,以及它如何融入更大的Laravel 生態系統。
Bouncer 是一個開源包,用於動態管理資料庫中的角色和權限,與 Laravel 的 Gate 完全整合。
在不深入細節的情況下,以下是其一些主要功能的簡短清單:
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();
... 還有更多。有關詳細信息,請查看完整的文檔,或只需瀏覽備忘單.
Taylor 新增了一個Laravel 5.2 中的新授權系統,稱為 Gate。這提供了一個很好用的API,用於應用程式中定義各種操作的權限檢查,
簡單 定義 回呼
和完整的 policies,以及根據您定義的內容在整個系統中掛接檢查權限。
ACL 的未來。真是太好了,Taylor 對清晰和直觀的 API 有這種驚人的感覺,而「Gate」抽象真正揭示了這一點。
然而,內建授權系統缺少一件事:動態權限,儲存在資料庫中。建立 Gate 的方式,所有檢查都由應用程式中定義的硬編碼函數執行,因此無法讓您的管理員在執行時透過某些儀表板 UI 控制其中任何一個。正如泰勒的 原始提交 明確指出:
[內建 Gate] 為組織邏輯提供了一種結構,該邏輯授權對實體進行操作。它沒有對「使用者角色」的定義做出任何決定。當時,還有許多其他流行的
ACL 作業系統支援在運行時調整權限,但它們有一個主要缺點:它們都是在Laravel 的Gate 之前建構的。它們是完全分離的系統;如果您決定使用它們,您將放棄 Laravel 的 gate 提供的所有細節和漂亮的整合。
我們在 Laravel 5.3 中對 gate 檢查做了一些改進,使其更加簡化和可預測,從而更容易將這些功能儲存在資料庫中。
保鑣 的職責是在門口提供安全保障並檢查人們的權限。所以這是與 Laravel 中的“Gate”非常自然的配對。
有趣的是,當時與我合作的標誌設計師(不是以英語為母語的人)沒有得到參考。以下是他設計的一些原始 logo:
#右邊的兩個顯然是受到彈跳動作的啟發。 在快速闡明了保鑣這個字的意思之後,我們開始迭代實際的保鑣 logo。我們嘗試了友善的保鑣、威脅的保鑣、大鬍子的保鑣、方下巴的保鏢,以及大量不同的變體。這裡只是少數:我非常喜歡我們最終得到的結果:它散發出強烈的安全感,但它的圓潤讓人感覺更友好,威脅更小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);
總的來說,Bouncer 處於一個非常好的位置。每個好的產品都有一個漫長的路線圖,認為我可以在發布 1.0 之前走到這條路的盡頭,這是愚蠢和不切實際的。
好了,到此為止。我希望您嘗試在您的應用程式中使用 Bouncer,並享受使用它。 Bouncer 的 API 被設計的像散文一樣,每個方法呼叫讀起來都像是合適的英文句子。試一試,如果您也有這種感覺,請告訴我!
【相關推薦:laravel影片教學】
以上是Laravel擴充建議:角色和權限管理工具'Bouncer”的詳細內容。更多資訊請關注PHP中文網其他相關文章!