为 `spatie/laravel-permission` 提供的丝印支持。

资助包维护!
MaherAlmatari

dev-main 2022-08-09 23:59 UTC

This package is auto-updated.

Last update: 2024-09-10 06:06:28 UTC


README

filament-shield-art

FILAMENT 8.x Packagist Tests Passing Code Style Passing Downloads

Filament Shield

为 Filament Admin 添加访问管理的最简单、最直观的方式

  • 🔥 资源
  • 🔥 页面
  • 🔥 小部件
  • 🔥 自定义权限

升级

要升级到最新版本,首先运行

composer update

v2.x

注意 最小 Filament 要求现在是 2.13

在继续之前,请先备份您的当前 config

  1. 1.x 升级

    1. App\Filament\Resources 删除 Shield 文件夹
    2. resources\lang\vendor or lang\vendor 删除 filament-shield
    3. resources\views\vendor 删除 filament-shield
    4. Config 删除 filament-shield.php
    5. 现在可以遵循以下步骤进行 仅升级
  2. 仅升级

    1. 发布 Config

      php artisan vendor:publish --tag=filament-shield-config --force
    2. 配置:根据您的 备份的配置 更新新的 已发布的配置

    3. 安装

      php artisan shield:upgrade

注意 对于 2.13 之前的 Filament,请使用 v1.1.12

安装

  1. 通过 composer 安装该包
composer require MaherAlmatari/filament-shield
  1. Spatie\Permission\Traits\HasRoles 特性添加到您的用户模型中
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles; //or HasFilamentShield

    // ...
}
  1. 使用以下命令发布 config
php artisan vendor:publish --tag=filament-shield-config
  1. 设置配置
<?php

    return [

          'shield_resource' => [
              'slug' => 'shield/roles',
              'navigation_sort' => -1,
              'navigation_badge' => true
          ],

          'auth_provider_model' => [
              'fqcn' => 'App\\Models\\User'
          ],

          'super_admin' => [
              'enabled' => true,
              'name'  => 'super_admin'
          ],

          'filament_user' => [
              'enabled' => true,
              'name' => 'filament_user'
          ],

          'permission_prefixes' => [
              'resource' => [
                  'view',
                  'view_any',
                  'create',
                  'update',
                  'restore',
                  'restore_any',
                  'replicate',
                  'reorder',
                  'delete',
                  'delete_any',
                  'force_delete',
                  'force_delete_any',
              ],

              'page' => 'page',
              'widget' => 'widget',
          ],

          'entities' => [
              'pages' => true,
              'widgets' => true,
              'resources' => true,
              'custom_permissions' => false,
          ],

          'generator' => [
              'option' => 'policies_and_permissions'
          ],

          'exclude' => [
              'enabled' => true,

              'pages' => [
                  'Dashboard',
              ],

              'widgets' => [
                  'AccountWidget','FilamentInfoWidget',
              ],

              'resources' => [],
          ],

          'register_role_policy' => [
              'enabled' => false
          ],
    ];
  1. 现在运行以下命令来安装 shield
php artisan shield:install

按照提示操作并享受!

资源自定义权限

您可以通过配置文件添加 Resources 的自定义权限。

页面

如果您为 Pages 生成过权限,您可以切换侧边栏中页面的导航和受限访问。您可以手动设置此操作,但此包包含一个 HasPageShield 特性以加快此过程。您只需在页面中使用该特性即可。

<?php

namespace App\Filament\Pages;

use ...;
use MaherAlmatari\FilamentShield\Traits\HasPageShield;

class MyPage extends Page
{
    use HasPageShield;
    ...
}

📕 HasPageShield 使用 booted 方法检查用户的权限,并确保在父页存在的情况下执行 booted 页面方法。

页面钩子

但是,如果您需要在 booted 方法之前和之后执行某些方法,您可以在您的 Filament 页面中声明以下钩子方法。

<?php

namespace App\Filament\Pages;

use ...;
use MaherAlmatari\FilamentShield\Traits\HasPageShield;

class MyPage extends Page
{
    use HasPageShield;
    ...

    protected function beforeBooted : void() {
        ...
    }

    protected function afterBooted : void() {
        ...
    }

    /**
     * Hook to perform an action before redirect if the user
     * doesn't have access to the page.  
     * */
    protected function beforeShieldRedirects : void() {
        ...
    }
}
页面重定向路径

HasPageShield 默认使用 config('filament.path') 值进行 shield 重定向。如果您需要重写重定向路径,只需将以下方法添加到您的页面中。

<?php

namespace App\Filament\Pages;

use ...;
use MaherAlmatari\FilamentShield\Traits\HasPageShield;

class MyPage extends Page
{
    use HasPageShield;
    ...

    protected function getShieldRedirectPath(): string {
        return '/'; // redirect to the root index...
    }
}

小部件

如果您为 Widgets 生成过权限,您可以基于用户是否有权限切换它们的状态。您可以手动设置此操作,但此包包含一个 HasWidgetShield 特性以加快此过程。您只需在您的部件中使用该特性即可。

<?php

namespace App\Filament\Widgets;

use ...;
use MaherAlmatari\FilamentShield\Traits\HasWidgetShield;

class IncomeWidget extends LineChartWidget
{
    use HasWidgetShield;
    ...
}

角色策略

如果您已将 'register_role_policy' => true 设置在配置中,则可以跳过此步骤。为确保通过 RolePolicy 通过 RoleResource 访问,您需要将以下内容添加到您的 AuthServiceProvider 中。

//AuthServiceProvider.php
...
protected $policies = [
    'Spatie\Permission\Models\Role' => 'App\Policies\RolePolicy',
];
...

翻译

使用以下命令发布翻译

php artisan vendor:publish --tag="filament-shield-translations"

可用的 Filament Shield 命令

- install   # One Command to Rule them All 🔥
- generate  # (Re)Discovers Filament resources and (re)generates Permissions and Policies.
- create    # Create Permissions and/or Policy for the given Filament Resource Model
- super-admin # Create a user with super_admin role
- upgrade # upgrade shield

测试

composer test

变更日志

有关最近更改的更多信息,请参阅 CHANGELOG

贡献

如果您想为此软件包做出贡献,您可能希望在真实的 Filament 项目中对其进行测试。

  • 将此存储库分叉到您的 GitHub 账户。
  • 在本地创建一个 Filament 应用。
  • 在 Filament 应用根目录中克隆您的分叉。
  • /filament-shield 目录下,为您的修复创建一个分支,例如 fix/error-message

在您的应用的 composer.json 中安装这些软件包。

"require": {
    "MaherAlmatari/filament-shield": "dev-fix/error-message as main-dev",
},
"repositories": [
    {
        "type": "path",
        "url": "filament-shield"
    }
]

现在,运行 composer update

有关详细信息,请参阅 CONTRIBUTING

安全漏洞

请查阅我们关于如何报告安全漏洞的 安全策略

致谢

许可证

MIT 许可证 (MIT)。请参阅 许可证文件 了解更多信息。