Rumah >rangka kerja php >Laravel >Pengesyoran sambungan Laravel: alat pengurusan peranan dan kebenaran 'Bouncer'
Selepas bertahun-tahun pembangunan, 56 keluaran, 1.3 juta muat turun dan lebih 2800 pengikut aktif, Bouncer akhirnya tiba pada versi 1.0. Ia sangat dipercayai dan stabil untuk beberapa lama, dan digunakan dalam pengeluaran oleh banyak aplikasi di seluruh dunia.
Ini adalah kemas kini peribadi saya yang mengandungi beberapa pemikiran saya selama ini - dari permulaan hingga keluaran akhir. Untuk mendapatkan maklumat teknikal tentang cara menggunakan Bouncer setiap hari, lihat dokumentasi yang luas atau dengar perbincangan saya dengan Matt Stover di The Laravel Podcast .
Sebelum memulakan perjalanan peribadi saya, berikut adalah pengenalan ringkas tentang apa itu Bouncer dan Bagaimana ia sesuai dengan ekosistem Laravel yang lebih besar.
Bouncer ialah pakej sumber terbuka untuk mengurus peranan dan kebenaran secara dinamik dalam pangkalan data, disepadukan sepenuhnya dengan Laravel's Gate.
Tanpa merinci terlalu banyak, berikut ialah senarai pendek beberapa ciri utamanya:
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();
...dan banyak lagi. Untuk mendapatkan maklumat lanjut, lihat Dokumentasi Penuh, atau cuma semak imbas Helaian Penipuan.
Kembali pada Ogos 2015, Taylor menambahkan sistem kebenaran baharu dalam Laravel 5.2 yang dipanggil Gate
. Ini menyediakan API yang bagus untuk mentakrifkan semakan kebenaran untuk pelbagai operasi dalam aplikasi anda, panggilan balik 定义
ringkas dan penuh dasar, serta berdasarkan kandungan yang anda tentukan disambungkan seluruh sistem untuk menyemak kebenaran .
Apabila saya mula menggunakannya, saya tahu ini akan menjadi masa depan ACL untuk semua aplikasi Laravel. Sungguh bagus bahawa Taylor mempunyai rasa yang menakjubkan ini untuk API yang jelas dan intuitif, dan abstraksi "Gate" benar-benar mendedahkannya.
Walau bagaimanapun, sistem kebenaran terbina dalam kehilangan satu perkara: kebenaran dinamik, disimpan dalam pangkalan data . Cara Gate dibina, semua semakan dilakukan oleh fungsi berkod keras yang ditakrifkan dalam aplikasi, jadi tiada cara untuk pentadbir anda mengawal mana-mana daripadanya semasa masa jalan melalui beberapa UI papan pemuka. Seperti yang dinyatakan oleh komit asal Taylor:
[Gerbang Terbina dalam] menyediakan struktur untuk mengatur logik yang membenarkan operasi pada entiti. Ia tidak membuat sebarang keputusan mengenai takrifan "peranan pengguna".
Pada masa itu, terdapat banyak sistem pengendalian ACL popular lain yang menyokong pelarasan kebenaran pada masa jalan, tetapi mereka mempunyai satu kelemahan utama: semuanya mendahului Laravel Gate
Dibina. Ia adalah sistem yang berasingan sepenuhnya; jika anda memutuskan untuk menggunakannya, anda melepaskan semua butiran dan integrasi indah yang disediakan oleh gerbang Laravel.
Jadi saya memutuskan untuk membina pakej sumber terbuka yang memberikan anda yang terbaik dari kedua-dua dunia: kebenaran dipacu pangkalan data dinamik, disepadukan sepenuhnya dengan get Laravel. Kami telah membuat beberapa penambahbaikan pada semakan pintu dalam Laravel 5.3 untuk menjadikannya lebih diselaraskan dan boleh diramal, menjadikannya lebih mudah untuk menyimpan fungsi ini dalam pangkalan data.
Saya terfikir nama “Bouncer” awal-awal lagi. Tugas bouncer ialah menyediakan keselamatan di pintu dan memeriksa kebenaran orang ramai. Jadi ini adalah gandingan yang sangat semula jadi dengan "Gate" dalam Laravel.
Menariknya, pereka logo yang saya bekerjasama pada masa itu (yang bukan penutur asli bahasa Inggeris) tidak mendapat rujukan. Berikut ialah beberapa logo asal yang dia reka:
Kedua-dua di sebelah kanan jelas diilhamkan oleh aksi melantun.
Setelah menjelaskan dengan cepat maksud perkataan pengawal peribadi, kami mula mengulangi logo pengawal peribadi yang sebenar. Kami mencuba bouncer mesra, bouncer mengancam, bouncer berjanggut, bouncer rahang persegi dan banyak variasi yang berbeza. Berikut adalah beberapa sahaja:
Saya benar-benar menyukai apa yang kami dapati:
Ia memancarkan rasa yang kuat rasa selamat, tetapi kebulatannya menjadikannya lebih mesra dan kurang mengancam
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);
Jika anda meneroka kod sumber Bouncer, anda akan menemui beberapa kod dan ujian tempat saya mula melaksanakan ini. Ia masih jauh dari lengkap, tetapi nantikan.
Secara keseluruhan, Bouncer berada di tempat yang sangat bagus. Setiap produk yang baik mempunyai pelan hala tuju yang panjang, dan adalah bodoh dan tidak realistik untuk berfikir bahawa saya boleh sampai ke penghujung jalan itu sebelum mengeluarkan 1.0.
Baiklah, itu sahaja. Saya harap anda cuba menggunakan Bouncer dalam aplikasi anda dan seronok menggunakannya. API Bouncer direka bentuk seperti prosa, dan setiap panggilan kaedah berbunyi seperti ayat bahasa Inggeris yang betul. Cubalah dan beritahu saya jika anda juga merasakannya!
[Cadangan berkaitan: tutorial video laravel]
Atas ialah kandungan terperinci Pengesyoran sambungan Laravel: alat pengurusan peranan dan kebenaran 'Bouncer'. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!