ホームページ  >  記事  >  PHPフレームワーク  >  Laravel拡張機能のおすすめ:ロール・権限管理ツール「Bouncer」

Laravel拡張機能のおすすめ:ロール・権限管理ツール「Bouncer」

青灯夜游
青灯夜游転載
2022-10-31 20:25:121492ブラウズ

Laravel拡張機能のおすすめ:ロール・権限管理ツール「Bouncer」

数年にわたる開発、56 回のリリース、130 万ダウンロード、2,800 人を超えるアクティブなフォロワーを経て、Bouncer がついにバージョン 1.0 に到達しました。かなり長い間、非常に信頼性が高く安定しており、世界中の無数のアプリによって運用環境で使用されています。

これは、開始から最終リリースまで、長年にわたる私の考えの一部を含む個人的なアップデートです。 Bouncer を毎日使用する方法に関する技術情報については、広範なドキュメントを確認するか、The Laravel Podcast での Matt Stover とのディスカッションを聞いてください。


バウンサーとは何ですか?

#個人的な旅を始める前に、バウンサーとは何か、またその仕組みについて簡単に説明します。より大きなLaravelエコシステムに適合します。

Bouncer は、データベース内のロールと権限を動的に管理するためのオープンソース パッケージであり、Laravel の Gate と完全に統合されています。

あまり詳細には触れずに、主な機能のいくつかの短いリストを以下に示します。

...他にもあります。詳細については、完全なドキュメントを確認するか、チートシートを参照してください。

Bouncer Initial Thoughts

2015 年 8 月に戻りますが、Taylor は、Gate と呼ばれる 新しい認証システムを Laravel 5.2 に追加しました。これは、アプリケーション内のさまざまな操作の権限チェック、単純な 定義 コールバック および完全な ポリシー 、およびフック チェック権限 を定義するための優れた API を提供します。 定義した内容に基づくシステム。

これを使い始めたとき、これがすべての Laravel アプリケーションにおける ACL の将来になるだろうと確信しました。 Taylor が明確で直感的な API に対してこの素晴らしい感覚を持っていることは素晴らしいことですが、「Gate」の抽象化はそれを本当に明らかにしています。

ただし、組み込みの承認システムには、データベースに保存される動的権限というものが欠けています。 Gate の構築方法では、すべてのチェックはアプリケーションに定義されたハードコーディングされた関数によって実行されるため、管理者が実行時にダッシュボード UI を介してそれらの関数を制御する方法はありません。 Taylor の original commit で明確に述べられているように、

[組み込みゲート] は、エンティティに対する操作を許可するロジックを組織化するための構造を提供します。 「ユーザーの役割」の定義については何も決定しません。

当時、実行時のアクセス許可の調整をサポートする人気の ACL オペレーティング システムは他にもたくさんありましたが、それらには 1 つの大きな欠点がありました。それは、それらはすべて Laravel の Gate に含まれていたということです。 以前に構築されました。これらは完全に別個のシステムであるため、これらを使用することに決めた場合、Laravel のゲートが提供するすべての詳細と美しい統合を放棄することになります。

そこで私は、Laravel のゲートと完全に統合された動的なデータベース主導のアクセス許可という、両方の長所を提供するオープンソース パッケージを構築することにしました。 Laravel 5.3 では、ゲートチェックをより合理化して予測可能にし、これらの関数をデータベースに保存しやすくするためにいくつかの改善を行いました。

バウンサーの名前とロゴ

「バウンサー」という名前は、かなり早い段階から考えていました。 ボディーガードの仕事は、玄関で警備を行い、人々の許可をチェックすることです。したがって、これは Laravel の「Gate」と非常に自然な組み合わせです。

興味深いことに、当時私が一緒に仕事をしていたロゴ デザイナー (英語を母国語としない人) は参考にしませんでした。彼がデザインしたオリジナルのロゴの一部を以下に示します。

Laravel拡張機能のおすすめ:ロール・権限管理ツール「Bouncer」右側の 2 つは、明らかに跳ねるアクションからインスピレーションを得たものです。

ボディーガードという言葉の意味をすぐに明確にした後、実際のボディーガードのロゴについて繰り返し検討を開始しました。私たちは、友好的な用心棒、脅迫的な用心棒、ひげを生やした用心棒、四角い顎の用心棒など、さまざまなバリエーションを試してみました。ここではほんの一部を紹介します:

Laravel拡張機能のおすすめ:ロール・権限管理ツール「Bouncer」 私たちが最終的に完成したものが本当に気に入っています:

Laravel拡張機能のおすすめ:ロール・権限管理ツール「Bouncer」 強いセンスがにじみ出ています。安全感はありますが、丸みがあるため、より親しみやすく、脅威が少ないと感じられます。

技术基础

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 のソース コードを調べると、これを実装し始めた codetests が見つかります。まだまだ完成には程遠いですが、楽しみにしていてください。

全体的に、『Bouncer』は非常に良い位置にあります。すべての優れた製品には長いロードマップがあり、1.0 をリリースする前にその道の終わりに到達できると考えるのは愚かで非現実的です。

ぜひ使ってみてください!

わかりました、以上です。あなたのアプリケーションで Bouncer を使用して楽しんでいただければ幸いです。 Bouncer の API は散文のように設計されており、各メソッド呼び出しは適切な英語の文章のように読み取れます。試してみて、あなたもそう感じたら教えてください!

[関連する推奨事項: laravel ビデオチュートリアル ]

以上がLaravel拡張機能のおすすめ:ロール・権限管理ツール「Bouncer」の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。