shroomok / discord-permission
根据 Discord 服务器成员角色设置角色和权限
Requires
- php: ^8.1
- restcord/restcord: *
- spatie/laravel-permission: ^5.9
Requires (Dev)
- orchestra/testbench: ^6.0|^7.0|^8.0
- phpunit/phpunit: ^9.4
This package is auto-updated.
Last update: 2024-06-27 05:01:34 UTC
README
Discord Permission for Laravel
此包根据 Discord 服务器中用户的角色自动授予 Laravel 用户的权限。
要求
- PHP >= 8.1
- Laravel >= 9.0
- spatie/laravel-permissions >= 5.9
- restcord/restcord
安装
composer require shroomok/discord-permission
.env
DISCORD_GUILD=<ID OF YOUR DISCORD GUILD (SERVER)>
配置 Discord 角色与 Laravel 权限/角色的映射:config/discord_permission.php
php artisan vendor:publish --provider="Shroomok\DiscordPermission\DiscordPermissionServiceProvider" --tag="config"
'roles_map' => [ [ 'discord_role' => 'moderator', 'laravel_roles' => ['moderator', 'editor'] ], [ 'discord_role' => 'donator', 'laravel_permissions' => ['access premium content'] ] ]
最后,在 app/Providers/AppServiceProvider.php 中注册 DiscordClient 依赖
namespace App\Providers; ... use RestCord\DiscordClient; class AppServiceProvider extends ServiceProvider { ... public function register() { $this->app->singleton(DiscordClient::class, function(){ // token definitely better to retrieve from config like: 'token' => config('services.discord.bot_token') return new DiscordClient(['token' => 'DISCORD BOT TOKEN']); }); } ... }
队列事件监听器
同步发生在 SyncDiscordRoles
监听器中,该监听器是可队列的。如果您的 QUEUE_CONNECTION
不是 sync
,请记住启动工作进程 php artisan queue:work
用例
例如,您正在运行基于 Laravel 框架的 Web 应用程序。同时,您还有一个与该网站相关的 Discord 社区。您已经实现了通过 Discord OAuth 的登录。拥有 Discord 账户的用户可以登录到您的 Web 应用程序。现在您想与您的社区成员分享一些特别的东西。但仅限于特定用户。或者这些用户已经是您的 Discord 公会中的管理员,并且最好在 Laravel 应用程序中授予他们相同的权限...在这个时候,DiscordPermission 包可以让您的生活更加轻松!
工作原理
它通过 restcord/restcord 与 Discord API 交互,以获取有关特定公会、成员及其角色的数据。
通过 spatie/laravel-permissions 在 Laravel 应用程序中对角色和权限进行操作。
主要逻辑包括 DiscordLoginSuccess
事件和 SyncDiscordRoles
监听器。
DiscordLoginSuccess
事件应在用户完成通过 Discord 的身份验证并应用程序检索到 discord_id 时触发。
SyncDiscordRoles
监听器与 Discord API 交互,检查传入用户的角色,然后分配(或不分配)Laravel 角色和/或权限。它实现了 ShouldQueue
接口,以便可以作为后台工作进程运行,不会在登录时压倒用户。
用户对象可以是任何具有 assignRole(string $role)
和 givePermissionTo(string $permission)
方法的对象。
基本上,它必须使用来自 spatie/laravel-permissions 包的 'HasRoles' 特性。
鸣谢
由 Shroomok 用爱心构建
和平 🍄