수년간의 개발 끝에 56개 출시, 130만 다운로드, 2,800명 이상의 활성 팔로워 Bouncer가 마침내 버전 1.0에 도달했습니다. 꽤 오랫동안 신뢰성과 안정성이 매우 뛰어났으며 전 세계 수많은 앱에서 프로덕션에 사용되고 있습니다.
이것은 처음부터 최종 출시까지 수년에 걸친 내 생각을 담은 개인적인 업데이트입니다. Bouncer를 매일 사용하는 방법에 대한 기술 정보는 광범위한 문서를 확인하거나 The Laravel Podcast에서 Matt Stover와의 토론을 들어보세요.
개인적인 여행을 시작하기 전에 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();
...그리고 더 많은 것. 자세한 내용은 전체 문서를 확인하거나 cheatsheet를 검색하세요.
2015년 8월에 Taylor는 Laravel 5.2에 새로운 인증 시스템을 추가했습니다. 코드>게이트. 이는 애플리케이션의 다양한 작업에 대한 권한 확인을 정의하기 위한 멋진 API를 제공합니다. Simple define 콜백
및 완전한 정책Gate
。这提供了一个很好用的 API,用于应用程序中定义各种操作的权限检查,简单 定义
回调 和完整的 policies,以及根据您定义的内容在 整个系统中挂接检查权限。
当我开始使用它时,我就知道这将是所有 Laravel 应用程序的 ACL 的未来。 真是太好了,Taylor 对清晰和直观的 API 有这种惊人的感觉,而「Gate」抽象真正地揭示了这一点。
然而,内置授权系统缺少一件事:动态权限,存储在数据库中。 构建 Gate 的方式,所有检查都由应用程序中定义的硬编码函数执行,因此无法让您的管理员在运行时通过某些仪表板 UI 控制其中任何一个。 正如泰勒的 原始提交 明确指出:
[内置 Gate] 为组织逻辑提供了一种结构,该逻辑授权对实体进行操作。 它没有对「用户角色」的定义做出任何决定。
当时,还有许多其他流行的 ACL 操作系统支持在运行时调整权限,但它们有一个主要缺点:它们都是在 Laravel 的 Gate
및 귀하가 정의한 내용 콘텐츠가 확인에 연결됩니다. 전체 시스템에 대한 권한
이 기능을 사용하기 시작했을 때 저는 이것이 모든 Laravel 애플리케이션에 대한 ACL이 될 것이라는 것을 알았습니다 미래. Taylor가 명확하고 직관적인 API에 대해 이렇게 놀라운 느낌을 갖고 있다는 것은 대단한 일이며, "게이트" 추상화는 이를 실제로 드러냅니다.
에 다음과 같이 명확하게 나와 있습니다. [Built-in Gate]는 엔터티에 대한 작업을 승인하는 논리를 구성하는 구조를 제공합니다. "사용자 역할"의 정의에 대해서는 어떠한 결정도 내리지 않습니다.
당시에는 다른 많은 인기 있는 ACL 운영 체제가 실행을 지원했습니다. 여기에는 한 가지 큰 단점이 있습니다. Laravel의 Gate
이전에 빌드되었다는 것입니다. 그것들은 완전히 별개의 시스템입니다. 이를 사용하기로 결정하면 Laravel의 게이트가 제공하는 모든 세부 사항과 아름다운 통합을 포기하게 됩니다.
Laravel 5.3 에서는 게이트 검사를 좀 더 간소화하고 예측 가능하게 하여 이러한 기능을 데이터베이스에 더 쉽게 저장할 수 있도록 몇 가지 기능을 개선했습니다.
바운서라는 이름은 아주 일찍부터 생각했어요. 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의 소스 코드를 탐색하면 제가 이것을 구현하기 시작한 code 및 tests를 찾을 수 있습니다. 완전하지는 않지만 계속 지켜봐 주시기 바랍니다.
전반적으로 Bouncer는 정말 좋은 위치에 있습니다. 모든 좋은 제품에는 긴 로드맵이 있으며, 1.0을 출시하기 전에 그 로드맵을 끝까지 완료할 수 있다고 생각하는 것은 어리석고 비현실적입니다.
그렇습니다. 귀하의 애플리케이션에서 Bouncer를 사용해 보시고 즐거운 시간을 보내시기 바랍니다. Bouncer의 API는 산문처럼 설계되었으며 각 메소드 호출은 적절한 영어 문장처럼 읽혀집니다. 한번 시도해 보시고 이런 느낌이 든다면 알려주세요!
【관련 추천: laravel 동영상 튜토리얼】
위 내용은 Laravel 확장 추천: 역할 및 권한 관리 도구 "Bouncer"의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!