溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Laravel角色和權(quán)限管理工具Bouncer有什么功能

發(fā)布時(shí)間:2022-11-01 09:05:07 來(lái)源:億速云 閱讀:92 作者:iii 欄目:編程語(yǔ)言

這篇文章主要介紹了Laravel角色和權(quán)限管理工具Bouncer有什么功能的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Laravel角色和權(quán)限管理工具Bouncer有什么功能文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

什么是 Bouncer?#

Bouncer 是一個(gè)開(kāi)源包,用于動(dòng)態(tài)管理數(shù)據(jù)庫(kù)中的角色和權(quán)限,與 Laravel 的 Gate 完全集成。

在不深入細(xì)節(jié)的情況下,以下是其一些主要功能的簡(jiǎn)短列表:

  • Simple abilities:


    Bouncer::allow($user)->to('access-dashboard');
  • Model abilities:


    Bouncer::allow($user)->to('view', Invoice::class);
    Bouncer::allow($user)->to('delete', $invoice);
  • Flexible roles:


    Bouncer::allow('admin')->everything();
    Bouncer::assign('admin')->to($user);
  • Forbidding abilities:


    Bouncer::allow($user)->to('view', Invoice::class);
    Bouncer::forbid($user)->to('view', $confidentialInvoice);
  • Powerful ownership:


    Bouncer::allow($user)->toOwn(Post::class);
  • Straighforward multi-tenancy:


    Bouncer::scope()->to($tenantId);
  • Built-in caching


    Bouncer::cache();

Bouncer 最初的想法

早在 2015 年 8 月,Taylor 添加了一個(gè) Laravel 5.2 中的新授權(quán)系統(tǒng),稱為 Gate。這提供了一個(gè)很好用的 API,用于應(yīng)用程序中定義各種操作的權(quán)限檢查,簡(jiǎn)單 定義 回調(diào) 和完整的 policies,以及根據(jù)您定義的內(nèi)容在 整個(gè)系統(tǒng)中掛接檢查權(quán)限。

當(dāng)我開(kāi)始使用它時(shí),我就知道這將是所有 Laravel 應(yīng)用程序的 ACL 的未來(lái)。 真是太好了,Taylor 對(duì)清晰和直觀的 API 有這種驚人的感覺(jué),而「Gate」抽象真正地揭示了這一點(diǎn)。

然而,內(nèi)置授權(quán)系統(tǒng)缺少一件事:動(dòng)態(tài)權(quán)限,存儲(chǔ)在數(shù)據(jù)庫(kù)中。 構(gòu)建 Gate 的方式,所有檢查都由應(yīng)用程序中定義的硬編碼函數(shù)執(zhí)行,因此無(wú)法讓您的管理員在運(yùn)行時(shí)通過(guò)某些儀表板 UI 控制其中任何一個(gè)。 正如泰勒的 原始提交 明確指出:

[內(nèi)置 Gate] 為組織邏輯提供了一種結(jié)構(gòu),該邏輯授權(quán)對(duì)實(shí)體進(jìn)行操作。 它沒(méi)有對(duì)「用戶角色」的定義做出任何決定。

當(dāng)時(shí),還有許多其他流行的 ACL 操作系統(tǒng)支持在運(yùn)行時(shí)調(diào)整權(quán)限,但它們有一個(gè)主要缺點(diǎn):它們都是在 Laravel 的 Gate 之前構(gòu)建的。它們是完全分離的系統(tǒng);如果您決定使用它們,你將放棄 Laravel 的 gate 提供的所有細(xì)節(jié)和漂亮的集成。

因此,我決定構(gòu)建一個(gè)開(kāi)源包,它可以讓您兩全其美:動(dòng)態(tài)數(shù)據(jù)庫(kù)驅(qū)動(dòng)的權(quán)限,與 Laravel 的 gate 完全集成。我們?cè)?Laravel 5.3 中對(duì) gate 檢查做了一些改進(jìn),使其更加簡(jiǎn)化和可預(yù)測(cè),從而更容易將這些功能存儲(chǔ)在數(shù)據(jù)庫(kù)中。

技術(shù)基礎(chǔ)

Bouncer's 的存在理由是與 Laravel 的 gate 無(wú)縫集成的。為了實(shí)現(xiàn)這一點(diǎn),我心中的只有一個(gè)目標(biāo):在為用戶分配角色和能力時(shí),您只需和 Bouncer 進(jìn)行交互。對(duì)于實(shí)際的授權(quán)檢查,整個(gè)系統(tǒng)中 Laravel 的鉤子應(yīng)該自動(dòng)工作,而不需任何特殊的 Bouncer 語(yǔ)法。ically, without any special Bouncer syntax.

將 Bouncer 掛鉤到 Laravel 的 gate 檢查方式是相當(dāng)簡(jiǎn)單的。Gate 讓你定義 一個(gè)全局的 before 回調(diào),它將會(huì)在任何您定義的檢查之前被調(diào)用:如果您的 before 回調(diào)允許或不許與某個(gè)操作,則不會(huì)運(yùn)行進(jìn)一步檢查。

雖然 before 回調(diào)最初是為 「允許管理員執(zhí)行所有操作」之類(lèi)的東西而設(shè)計(jì)的,但我立即意識(shí)到這將是連接動(dòng)態(tài)檢查的理想場(chǎng)所,允許我查詢數(shù)據(jù)庫(kù)以獲得任何權(quán)限。這就是它最初的工作方式(我們后來(lái)將其切換為使用 after 回調(diào) - 你可以閱讀更多關(guān)于 在此線程)

文檔

從一開(kāi)始,文檔對(duì)我來(lái)說(shuō)就非常重要。 開(kāi)源項(xiàng)目的生死取決于他們的文檔,所以我希望 Bouncer 的文檔盡可能做到最好。尤其是在 Laravel 生態(tài)系統(tǒng)中,Taylor 為細(xì)致的文檔設(shè)定了極高的標(biāo)準(zhǔn)。

在某種程度上,清晰的文檔有時(shí)甚至比代碼本身更重要。如果不告訴你的用戶如何使用你的工具,他們中很少有人會(huì)使用源代碼來(lái)解決這個(gè)問(wèn)題。他們只會(huì)繼續(xù)做下一件事。

我將 Bouncer 的成功很大程度上歸功于清晰的文檔,但在這方面還有很多工作要做。作為創(chuàng)建者,對(duì)整個(gè)謎題有一個(gè)清晰的了解,很容易忘記剛接觸該工具的人會(huì)遇到什么困難。

例如:如前所述,Bouncer 僅用于為用戶分配角色和權(quán)限。實(shí)際的授權(quán)檢查將像在任何標(biāo)準(zhǔn) Laravel 應(yīng)用程序中一樣處理。所以我想我不必重復(fù)所有這些,因?yàn)?Laravel 文檔中清楚地概述了它。盡管如此,我仍然看到人們?yōu)榇丝嗫鄴暝?。他們?cè)O(shè)置了自己的角色和權(quán)限,然后不知道從哪里開(kāi)始。這是我仍然想在文檔中充實(shí)的一個(gè)領(lǐng)域。

準(zhǔn)備發(fā)布

將 1.0 版本推遲到現(xiàn)在對(duì)我的用戶造成了傷害。 Bouncer 多年來(lái)一直很穩(wěn)定,并在世界各地的生產(chǎn)中積極使用。 然而,我總是猶豫要不要發(fā)布它,因?yàn)槲抑牢蚁胩砑拥臇|西太多了。 我在 播客 上與 Matt 詳細(xì)討論了這個(gè)問(wèn)題:我掉進(jìn)了想要在發(fā)布之前讓它變得完美的陷阱,這顯然是 不可能的。 正如伏爾泰 已警告:「完美是良好的敵人」。

因此,當(dāng)我發(fā)布 Bouncer 1.0 版時(shí),我仍然希望在初始版本中包含 2 個(gè)出色的功能,但沒(méi)有成功:

  • 每個(gè)模型的角色。 很長(zhǎng)一段時(shí)間以來(lái),人們一直在吵著要一種方法,只為給定的模型(或模型類(lèi))分配角色給用戶。 這是該代碼的樣子:

  • // 注意:這還沒(méi)有實(shí)現(xiàn)
    Bouncer::allow('editor')->to(['view', 'edit'])->everything();
    Bouncer::assign('editor')->to($user)->for(Invoice:class);
  • 這樣,用戶就可以查看和編輯所有發(fā)票,但不能做其他任何事情。 當(dāng)然,這現(xiàn)在可以在沒(méi)有角色的情況下直接完成,但通過(guò)角色來(lái)完成會(huì)提供另一層靈活性。

    我已經(jīng)嘗試過(guò)多次解決這個(gè)問(wèn)題,但結(jié)果非常棘手,因?yàn)榫彺孀兂闪艘粓?chǎng)真正的噩夢(mèng)。 我仍然希望有一天能解決它。 走著瞧。

  • 能力限制。 允許對(duì)給定能力進(jìn)行任意限制將增加更精細(xì)的控制:

  • // 注意:這還沒(méi)有實(shí)現(xiàn)
    Bouncer::allow($user)
    ->to('view', Post::class)
    ->where('is_confidential', false);

關(guān)于“Laravel角色和權(quán)限管理工具Bouncer有什么功能”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Laravel角色和權(quán)限管理工具Bouncer有什么功能”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI