jmkim/laravel-entrust-gui

Shanmuga's LaravelEntrust for Laravel 5+ (5, 6, 7, 8 和 9) 的 GUI

dev-6.x-and-above 2022-06-08 06:21 UTC

This package is auto-updated.

Last update: 2024-09-08 11:15:12 UTC


README

Code Climate Build Status Latest Stable Version Total Downloads Latest Unstable Version License

Entrust GUI 是一个 Admin 界面,它使 Shanmuga's Laravel Entrust 包的用户、角色和权限管理更加容易。

此包目前不用于处理用户身份验证、授权或注册。

User Panel Preview

免责声明

Entrust GUI 完全由 Mitch Stanley (@acoustep) 编写。原始代码库位于 https://github.com/acoustep/entrust-gui

此包是 Shanmuga's Laravel Entrust 的移植。

您可以通过将

  • Acoustep 替换为 Jmkim
  • acoustep 替换为 jmkim

安装

将包添加到您的 composer.json 文件

"jmkim/laravel-entrust-gui": "6.x-dev",
"shanmuga/laravel-entrust": "3.x-dev",
"watson/validating": "3.2.0 as 2.0.1"

将服务提供者添加到您的 config/app.php 文件

Jmkim\EntrustGui\EntrustGuiServiceProvider::class,

同样在 config/app.php 文件中添加 Entrust 别名。

'Entrust'   => Shanmuga\LaravelEntrust\LaravelEntrustFacade::class,

发布配置文件

php artisan vendor:publish --tag="config"

table 键与值 users 添加到 config/auth.php 文件中的 providers.users 数组。

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
            'table' => 'users',
        ],
        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

如果您尚未设置 Entrust,则创建迁移文件并运行迁移。

php artisan entrust:migration
php artisan migrate

如果您看到以下错误

 [Illuminate\Database\QueryException]
  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table
   `users` add unique `users_email_unique`(`email`))

请将以下内容添加到您的 app/Providers/AppServiceProvider.php

use Illuminate\Support\Facades\Schema;
...
public function boot() {
    Schema::defaultStringLength(191);
}

如果您看到此错误

ReflectionException  : Method Shanmuga\LaravelEntrust\MakeMigrationCommand::handle() does not exist

这是 Entrust 的问题,可以通过访问 vendor-> shanmuga-> laravel-entrust-> src-> commands-> MakeMigrationCommand.php 并将 fire() 更改为 handle() 来临时修复。重新运行迁移。有关更多详细信息,请参阅 此处。完成此操作后,重新运行迁移命令。

最后,如果您看到此错误

(errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `role_user` add constraint `role_user_user_id_foreign` foreign key (`user_id`) references `users` (`id`) on delete cascade on update cascade)

转到新创建的迁移文件(entrust_setup_tables)并更新 role_user 中的外键约束 user_id 以使用 bigInteger

Schema::create('role_user', function (Blueprint $table) {
            $table->bigInteger('user_id')->unsigned();
            $table->integer('role_id')->unsigned();

            $table->foreign('user_id')->references('id')->on('users')
                ->onUpdate('cascade')->onDelete('cascade');
            $table->foreign('role_id')->references('id')->on('roles')
                ->onUpdate('cascade')->onDelete('cascade');

            $table->primary(['user_id', 'role_id']);
});

之后重新运行 entrust 迁移(您可能还需要清理数据库)。

Entrust GUI 使用 esensi/model,这意味着您可以在模型中设置验证规则。

要生成 UserRolePermission 模型,请运行 entrust-gui:models 命令。

php artisan entrust-gui:models

如果您更喜欢手动调整当前模型文件,请参阅 手动创建模型 部分。

默认情况下,所有三个文件都发布到 app_path() 目录。您可以分别指定文件和位置。

将 Entrust GUI 中间件添加到 app\Http\Kernal.php。此中间件将允许具有 admin(区分大小写)角色的用户访问 Entrust GUI,并拒绝其他用户。

protected $routeMiddleware = [
  // ...
  'entrust-gui.admin' => \Jmkim\EntrustGui\Http\Middleware\AdminAuth::class,
];

最后,目前Entrust存在一个问题,需要您将缓存驱动设置为array。这在未来可能会改变。您可以在您的.env文件中更改此设置。

CACHE_DRIVER=array

到此为止,您就可以开始了。请参阅“入门”部分了解如何使用此软件包。

入门

使用Laravel身份验证

如果您还没有设置,请运行auth命令。

php artisan make:auth

访问Entrust GUI

默认情况下,所有路由都以前缀/entrust-gui开头。

  • 用户:/entrust-gui/users
  • 角色:/entrust-gui/roles
  • 权限:/entrust-gui/permissions

您可以通过编辑config/entrust-gui.php中的route-prefix来更改此前缀。

'route-prefix' => 'admin'

如果您未以管理员身份登录(使用默认的entrust-gui.admin中间件),则指向/entrust-gui/users的应用程序将重定向到/auth/login

如果您尚未设置Laravel身份验证,您将看到NotFoundHttpException异常。有关在Laravel 5.1中设置登录系统的说明,请参阅Laravel身份验证文档。

中间件

默认情况下,Entrust GUI使用entrust-gui.admin作为中间件。这允许具有admin角色的登录用户访问。

您可以在config/entrust-gui.phpmiddleware设置中更改中间件。

如果您想在不使用中间件的情况下测试系统,请转到config/entrust-gui.php,删除entrust-gui.admin中间件,并保留web,这是Laravel 5.2中闪存消息正确工作的必要条件。

'middleware' => 'web',

如果您想更改具有admin中间件访问权限的角色的名称,请更新配置文件中的middleware-role

"middleware-role" => 'sudo-admin',

布局

要使用自己的布局,请覆盖config/entrust-gui.php中的layout键,使用您希望使用的模板。

"layout" => "app", // located in views/app.blade.php

每个模板都产生headingcontent,因此请确保您的新布局有这些部分。

<html>
<head>
  <meta charset="UTF-8">
  <title>title</title>
</head>
<body>
  <h1>@yield('heading')</h1>
  @include('entrust-gui::partials.notifications')
  @yield('content')
</body>
</html>

编辑模板

要编辑模板文件,您首先需要发布它们

php artisan vendor:publish --tag="views"

所有文件都存储在resources/views/vendor/entrust-gui目录中。

路由

您可能希望在您的模板中链接到页面。EntrustGUI遵循Laravel的Route::resource方法,但除show外。

route('entrust-gui::users.index')
route('entrust-gui::users.create')
route('entrust-gui::users.destroy', $id)
route('entrust-gui::users.update', $id)
route('entrust-gui::users.edit', $id)

事件

以下事件类可用

  • UserCreatedEventUserDeletedEventUserUpdatedEvent
  • RoleCreatedEventRoleDeletedEventRoleUpdatedEvent
  • PermissionCreatedEventPermissionDeletedEventPermissionUpdatedEvent

示例事件监听器

<?php

namespace App\Listeners;

use Jmkim\EntrustGui\Events\UserCreatedEvent;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Log;

class UserCreatedListener
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  UserCreatedEvent  $event
     * @return void
     */
    public function handle(UserCreatedEvent $event)
    {
      Log::info('created: '.$event->user->email);
    }
}

将您需要使用的监听器添加到app/Providers/EventServiceProvider.php中。

protected $listen = [
  'Jmkim\EntrustGui\Events\UserCreatedEvent' => [
    'App\Listeners\UserCreatedListener',
  ],
  'Jmkim\EntrustGui\Events\UserUpdatedEvent' => [
    'App\Listeners\UserUpdatedListener',
  ],
  'Jmkim\EntrustGui\Events\UserDeletedEvent' => [
    'App\Listeners\UserDeletedListener',
  ],
  'Jmkim\EntrustGui\Events\RoleCreatedEvent' => [
    'App\Listeners\RoleCreatedListener',
  ],
  'Jmkim\EntrustGui\Events\RoleUpdatedEvent' => [
    'App\Listeners\RoleUpdatedListener',
  ],
  'Jmkim\EntrustGui\Events\RoleDeletedEvent' => [
    'App\Listeners\RoleDeletedListener',
  ],
  'Jmkim\EntrustGui\Events\PermissionCreatedEvent' => [
    'App\Listeners\PermissionCreatedListener',
  ],
  'Jmkim\EntrustGui\Events\PermissionUpdatedEvent' => [
    'App\Listeners\PermissionUpdatedListener',
  ],
  'Jmkim\EntrustGui\Events\PermissionDeletedEvent' => [
    'App\Listeners\PermissionDeletedListener',
  ]
];

编辑翻译

运行发布翻译命令

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

翻译随后发布到resources/lang/vendor/entrust-gui

将密码确认字段添加到用户

更新您的User模型为以下内容

<?php namespace App;

use Esensi\Model\Contracts\PurgingModelInterface;
use Esensi\Model\Traits\PurgingModelTrait;
use Illuminate\Auth\Authenticatable;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
use Illuminate\Database\Eloquent\Model;
use Shanmuga\LaravelEntrust\Traits\LaravelEntrustUserTrait;
use Jmkim\EntrustGui\Contracts\HashMethodInterface;
use Hash;

class User extends Model implements AuthenticatableContract, CanResetPasswordContract, ValidatingModelInterface, HashMethodInterface, PurgingModelInterface
{
    use Authenticatable, CanResetPassword, ValidatingModelTrait, EntrustUserTrait, PurgingModelTrait;

    protected $throwValidationExceptions = true;

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'users';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['name', 'email', 'password', 'password_confirmation'];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = ['password', 'remember_token'];

    protected $purgeable = [
        'password_confirmation',
    ];

    protected $hashable = ['password'];

    protected $rulesets = [

        'creating' => [
            'email'      => 'required|email|unique:users',
            'password'   => 'required|confirmed',
        ],

        'updating' => [
            'email'      => 'required|email|unique:users',
            'password'   => 'confirmed',
        ],
    ];

    public function entrustPasswordHash() 
    {
        $this->password = Hash::make($this->password);
        $this->forceSave();
    }
}

更新config/entrust-gui.php

'confirmable' => true,

生成模型命令选项

生成特定模型

php artisan entrust-gui:models User

更改模型目录目标

php artisan entrust-gui:models --path=new/path

跳过覆盖现有文件的确认提示

php artisan entrust-gui:models --force

手动创建模型

以下是UserRolePermission模型。请确保包含这些参数和特质,以便软件包按预期工作。

app/User.php

<?php namespace App;

use Esensi\Model\Contracts\ValidatingModelInterface;
use Esensi\Model\Traits\ValidatingModelTrait;
use Illuminate\Auth\Authenticatable;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
use Illuminate\Database\Eloquent\Model;
use Shanmuga\LaravelEntrust\Traits\LaravelEntrustUserTrait;
use Jmkim\EntrustGui\Contracts\HashMethodInterface;
use Hash;

class User extends Model implements AuthenticatableContract, CanResetPasswordContract, ValidatingModelInterface, HashMethodInterface
{
  use Authenticatable, CanResetPassword, ValidatingModelTrait, EntrustUserTrait;

    protected $throwValidationExceptions = true;

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'users';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['name', 'email', 'password'];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = ['password', 'remember_token'];

    protected $hashable = ['password'];

    protected $rulesets = [

        'creating' => [
            'email'      => 'required|email|unique:users',
            'password'   => 'required',
        ],

        'updating' => [
            'email'      => 'required|email|unique:users',
            'password'   => '',
        ],
    ];

    public function entrustPasswordHash() 
    {
        $this->password = Hash::make($this->password);
        $this->save();
    }

}

app/Role.php

<?php namespace App;

use Esensi\Model\Contracts\ValidatingModelInterface;
use Esensi\Model\Traits\ValidatingModelTrait;
use Shanmuga\LaravelEntrust\LaravelEntrustRole;

class Role extends EntrustRole implements ValidatingModelInterface
{
  use ValidatingModelTrait;

  protected $throwValidationExceptions = true;

  protected $fillable = [
    'name',
    'display_name',
    'description',
  ];

  protected $rules = [
    'name'      => 'required|unique:roles',
    'display_name'      => 'required|unique:roles',
  ];
}

app/Permission.php

<?php namespace App;

use Esensi\Model\Contracts\ValidatingModelInterface;
use Esensi\Model\Traits\ValidatingModelTrait;
use Shanmuga\LaravelEntrust\LaravelEntrustPermission;

class Permission extends EntrustPermission implements ValidatingModelInterface
{
  use ValidatingModelTrait;

  protected $throwValidationExceptions = true;

  protected $fillable = [
    'name',
    'display_name',
    'description',
  ];

  protected $rules = [
    'name'      => 'required|unique:permissions',
  ];
}

用户的自定义查询、排序和筛选

如果您想搜索、排序和筛选用户,可以使用l5-repository searchable fields功能。

在您的entrust-gui.php配置文件中,添加您希望可搜索的字段

    "users" => [
       'fieldSearchable' => [
           'email'
       ],
     ],

您现在可以创建如下链接

您可以在此处了解更多关于这些选项的信息。

升级指南 / 破坏性更改

5.2 分支

将以下内容添加到 config/entrust-gui.php 配置文件中,以启用自定义排序和筛选:

    "users" => [
       'fieldSearchable' => [],
     ],

可选地移除 Esensi\Model\Traits\HashingModelTrait。用 Jmkim\EntrustGui\Contracts\HashMethodInterface 替换,并允许用户在 Entrust GUI 中设置自己的密码哈希方法。对于默认的 Laravel 5.2 Auth,建议在您的 User 模型中使用以下片段。

use Jmkim\EntrustGui\Contracts\HashMethodInterface;
use Hash;
class User extends Model implements AuthenticatableContract, CanResetPasswordContract, ValidatingModelInterface, HashMethodInterface
    // ...
    public function entrustPasswordHash() 
    {
        $this->password = hash::make($this->password);
        $this->save();
    }
}

0.6

包含一个新的配置键,"unauthorized-url",允许您设置用户未被授权时的重定向。如果找不到此键,它将使用旧的重定向地址,/auth/login。默认设置为 /login,以匹配 Laravel 5.2 内置的认证路由。

0.3.* 到 0.4.0

从 0.4.0 开始,Entrust GUI 从 dwightwatson/validating 切换到 esensi/model

密码哈希已从包移动到 User 模型。

将您的 User 模型更新为最新文档中的版本。

'confirmable' => false, 添加到您的配置文件中。

如果您打算使用 confirmable 选项并且已经发布了视图,请将以下内容添加到您的 resources/views/vendor/entrust-gui/users/partials/form.blade.php 模板中:

@if(Config::get('entrust-gui.confirmable') === true)
<div class="form-group">
    <label for="password">Confirm Password</label>
    <input type="password" class="form-control" id="password_confirmation" placeholder="Confirm Password" name="password_confirmation">
</div>
@endif

支持 Entrust GUI

如果您想帮忙,请随时提交有关功能请求或建议的问题。

待办事项

  • 高级中间件配置
  • 更多测试
  • 更多文档
  • 动画视频预览