From 04ef39ab2845282cb5151e9a5ae4faf7e0777ea7 Mon Sep 17 00:00:00 2001 From: qiyueshiyi Date: Thu, 16 Feb 2017 10:49:46 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9D=83=E9=99=90?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=91=BD=E4=BB=A4,=20=E6=B7=BB=E5=8A=A0=20Pe?= =?UTF-8?q?rmissionManager,=20=E7=94=A8=E4=BA=8E=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=9D=83=E9=99=90=E6=96=87=E4=BB=B6=E7=9A=84=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E5=92=8C=E8=8E=B7=E5=8F=96,=20=E5=9C=A8=20MemberServiceProvide?= =?UTF-8?q?r=20=E4=B8=AD=20bind=20PermissionManager=20=E4=B8=BA=20permissi?= =?UTF-8?q?on=20=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Commands/PermissionExportCommand.php | 95 +++++++++++++++++++ src/Member/MemberServiceProvider.php | 9 ++ src/Member/PermissionManager.php | 43 +++++++++ 3 files changed, 147 insertions(+) create mode 100644 src/Member/Commands/PermissionExportCommand.php create mode 100644 src/Member/PermissionManager.php diff --git a/src/Member/Commands/PermissionExportCommand.php b/src/Member/Commands/PermissionExportCommand.php new file mode 100644 index 00000000..58b4c79c --- /dev/null +++ b/src/Member/Commands/PermissionExportCommand.php @@ -0,0 +1,95 @@ + + * @copyright (c) 2017, iBenchu.org + * @datetime 2017-02-15 18:01 + */ + +namespace Notadd\Foundation\Member\Commands; + +use Illuminate\Console\Command; +use Illuminate\Console\ConfirmableTrait; +use Notadd\Foundation\Member\Permission; +use Symfony\Component\Console\Input\InputOption; + +class PermissionExportCommand extends Command +{ + use ConfirmableTrait; + + protected $name = 'permission'; + + protected $signature = 'permission:export + {key? : Register permission config file path key.} + {--path= : From file create permission.} + {--force : Force create}'; + + protected $description = 'Export Permissions to database'; + + /** + * @var \Notadd\Foundation\Member\PermissionManager + */ + protected $permissionManager; + + public function __construct() + { + parent::__construct(); + + $this->permissionManager = app('permission'); + } + + public function handle() + { + if (! $this->confirmToProceed()) { + return; + } + + $permissions = []; + + $key = $this->argument('key'); + if (! empty($key) && ! empty($realPath = $this->permissionManager->getFilePath($key)) && file_exists($realPath)) { + $permissions = require $realPath; + } + + $path = $this->option('path'); + if (! empty($path) && file_exists($path)) { + $permissions = require $path; + } + + if (empty($permissions) || count($permissions) < 0) { + $this->info('没有可导入的权限.'); + return; + } + + $i = 0; + foreach ($permissions as $permission) { + if (! isset($permission['display_name']) || ! isset($permission['name']) || empty($permission['display_name']) || empty($permission['name'])) { + continue; + } + + if (Permission::where('name', $permission['name'])->count()) { + continue; + } + + Permission::addPermission($permission['name'], $permission['display_name'], isset($permission['description']) ? $permission['description'] : ''); + $i++; + } + + $this->info("导入 {$i} 个权限."); + } + + /** + * Get the console command options. + * + * @return array + */ + protected function getOptions() + { + return [ + ['force', null, InputOption::VALUE_NONE, 'Force the operation to run when in production.'], + + ['path', null, InputOption::VALUE_OPTIONAL, 'The path of permissions file to be executed.'], + ]; + } +} diff --git a/src/Member/MemberServiceProvider.php b/src/Member/MemberServiceProvider.php index cdfac8f2..f0a1a8cb 100644 --- a/src/Member/MemberServiceProvider.php +++ b/src/Member/MemberServiceProvider.php @@ -9,6 +9,7 @@ namespace Notadd\Foundation\Member; use Illuminate\Support\ServiceProvider; +use Notadd\Foundation\Member\Commands\PermissionExportCommand; /** * Class MemberServiceProvider. @@ -28,5 +29,13 @@ class MemberServiceProvider extends ServiceProvider return $manager->manager(); }); + + $this->app->bind('permission', function ($app) { + return new PermissionManager; + }); + + $this->commands([ + PermissionExportCommand::class, + ]); } } diff --git a/src/Member/PermissionManager.php b/src/Member/PermissionManager.php new file mode 100644 index 00000000..834f5d35 --- /dev/null +++ b/src/Member/PermissionManager.php @@ -0,0 +1,43 @@ + + * @copyright (c) 2017, iBenchu.org + * @datetime 2017-02-15 18:57 + */ + +namespace Notadd\Foundation\Member; + +class PermissionManager +{ + const PATH_PREFIX = 'permission.paths.'; + + // protected $config; + // + // public function __construct($config) + // { + // $this->config = $config; + // } + + /** + * @param string $key + * @param string $path + */ + public function registerFilePath(string $key, string $path) + { + if (! app('config')->has(static::PATH_PREFIX . $key)) { + app('config')->set(static::PATH_PREFIX . $key, $path); + } + } + + /** + * @param string $key + * + * @return string + */ + public function getFilePath(string $key) + { + return app('config')->get(static::PATH_PREFIX . $key, ''); + } +} -- Gitee From 6aade44aea750e8cb1860bf4cee5dc162e10dcd8 Mon Sep 17 00:00:00 2001 From: qiyueshiyi Date: Thu, 16 Feb 2017 13:18:55 +0800 Subject: [PATCH 2/5] Renamed PermissionExportCommand to PermissionCommand, add getFilePaths function to PermissionManager, renamed permission:export command to permission --- ...xportCommand.php => PermissionCommand.php} | 20 +++++++++++++++---- src/Member/MemberServiceProvider.php | 4 ++-- src/Member/PermissionManager.php | 8 ++++++++ 3 files changed, 26 insertions(+), 6 deletions(-) rename src/Member/Commands/{PermissionExportCommand.php => PermissionCommand.php} (78%) diff --git a/src/Member/Commands/PermissionExportCommand.php b/src/Member/Commands/PermissionCommand.php similarity index 78% rename from src/Member/Commands/PermissionExportCommand.php rename to src/Member/Commands/PermissionCommand.php index 58b4c79c..13db0eac 100644 --- a/src/Member/Commands/PermissionExportCommand.php +++ b/src/Member/Commands/PermissionCommand.php @@ -14,13 +14,13 @@ use Illuminate\Console\ConfirmableTrait; use Notadd\Foundation\Member\Permission; use Symfony\Component\Console\Input\InputOption; -class PermissionExportCommand extends Command +class PermissionCommand extends Command { use ConfirmableTrait; protected $name = 'permission'; - protected $signature = 'permission:export + protected $signature = 'permission {key? : Register permission config file path key.} {--path= : From file create permission.} {--force : Force create}'; @@ -49,12 +49,24 @@ class PermissionExportCommand extends Command $key = $this->argument('key'); if (! empty($key) && ! empty($realPath = $this->permissionManager->getFilePath($key)) && file_exists($realPath)) { - $permissions = require $realPath; + $permissions = (array) require $realPath; } $path = $this->option('path'); if (! empty($path) && file_exists($path)) { - $permissions = require $path; + $permissions = (array) require $path; + } + + // 如果没有指定某个权限文件, 就执行导入所有注册的权限文件 + if (! $this->argument('key') && ! $this->option('path')) { + $paths = $this->permissionManager->getFilePaths(); + foreach ($paths as $path) { + if (empty($path) || ! file_exists($path)) { + continue; + } + + $permissions = array_merge($permissions, (array) require $path); + } } if (empty($permissions) || count($permissions) < 0) { diff --git a/src/Member/MemberServiceProvider.php b/src/Member/MemberServiceProvider.php index f0a1a8cb..fa6e061a 100644 --- a/src/Member/MemberServiceProvider.php +++ b/src/Member/MemberServiceProvider.php @@ -9,7 +9,7 @@ namespace Notadd\Foundation\Member; use Illuminate\Support\ServiceProvider; -use Notadd\Foundation\Member\Commands\PermissionExportCommand; +use Notadd\Foundation\Member\Commands\PermissionCommand; /** * Class MemberServiceProvider. @@ -35,7 +35,7 @@ class MemberServiceProvider extends ServiceProvider }); $this->commands([ - PermissionExportCommand::class, + PermissionCommand::class, ]); } } diff --git a/src/Member/PermissionManager.php b/src/Member/PermissionManager.php index 834f5d35..7cd2cb25 100644 --- a/src/Member/PermissionManager.php +++ b/src/Member/PermissionManager.php @@ -40,4 +40,12 @@ class PermissionManager { return app('config')->get(static::PATH_PREFIX . $key, ''); } + + /** + * @return array + */ + public function getFilePaths() + { + return app('config')->get(rtrim(static::PATH_PREFIX, '.'), []); + } } -- Gitee From 262a7d2572ed2315b9aa3f3f744d37f7e0d4e42a Mon Sep 17 00:00:00 2001 From: qiyueshiyi Date: Thu, 16 Feb 2017 14:16:22 +0800 Subject: [PATCH 3/5] Add Permission middleware, register permission middleware --- src/Member/MemberServiceProvider.php | 8 +++++ src/Member/Middleware/Permission.php | 52 ++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 src/Member/Middleware/Permission.php diff --git a/src/Member/MemberServiceProvider.php b/src/Member/MemberServiceProvider.php index fa6e061a..ad6d0f9b 100644 --- a/src/Member/MemberServiceProvider.php +++ b/src/Member/MemberServiceProvider.php @@ -10,6 +10,7 @@ namespace Notadd\Foundation\Member; use Illuminate\Support\ServiceProvider; use Notadd\Foundation\Member\Commands\PermissionCommand; +use Notadd\Foundation\Member\Middleware\Permission; /** * Class MemberServiceProvider. @@ -37,5 +38,12 @@ class MemberServiceProvider extends ServiceProvider $this->commands([ PermissionCommand::class, ]); + + $this->registerMiddleware(); + } + + public function registerMiddleware() + { + $this->app['router']->middleware('permission', Permission::class); } } diff --git a/src/Member/Middleware/Permission.php b/src/Member/Middleware/Permission.php new file mode 100644 index 00000000..a291c627 --- /dev/null +++ b/src/Member/Middleware/Permission.php @@ -0,0 +1,52 @@ + + * @copyright (c) 2017, iBenchu.org + * @datetime 2017-02-16 13:41 + */ + +namespace Notadd\Foundation\Member\Middleware; + +use Closure; +use Illuminate\Http\Request; +use Illuminate\Http\JsonResponse; + +class Permission +{ + protected $auth; + + public function __construct() + { + $this->auth = app('auth'); + } + + /** + * Handle an incoming request. + * + * @param \Illuminate\Http\Request $request + * @param Closure $next + * @param $permissions + * + * @return mixed + */ + public function handle(Request $request, Closure $next, $permissions) + { + if ($this->auth->guest() || ! $request->user()->hasPermission(explode('|', $permissions))) { + if ($this->wantsJson()) { + return new JsonResponse('Forbidden', 403); + } + + abort(403); + } + + return $next($request); + } + + protected function wantsJson() + { + return (app('request')->ajax() || app('request')->wantsJson()) ? true : false; + } +} -- Gitee From 3162f80aa1d3521b2f47075edb3ac0e331cf9453 Mon Sep 17 00:00:00 2001 From: qiyueshiyi Date: Thu, 16 Feb 2017 14:23:10 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20MemberServiceProvider?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Member/MemberServiceProvider.php | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/Member/MemberServiceProvider.php b/src/Member/MemberServiceProvider.php index ad6d0f9b..ae7892c6 100644 --- a/src/Member/MemberServiceProvider.php +++ b/src/Member/MemberServiceProvider.php @@ -31,13 +31,9 @@ class MemberServiceProvider extends ServiceProvider return $manager->manager(); }); - $this->app->bind('permission', function ($app) { - return new PermissionManager; - }); + $this->registerPermission(); - $this->commands([ - PermissionCommand::class, - ]); + $this->registerCommands(); $this->registerMiddleware(); } @@ -46,4 +42,18 @@ class MemberServiceProvider extends ServiceProvider { $this->app['router']->middleware('permission', Permission::class); } + + public function registerCommands() + { + $this->commands([ + PermissionCommand::class, + ]); + } + + public function registerPermission() + { + $this->app->bind('permission', function ($app) { + return new PermissionManager; + }); + } } -- Gitee From 463ca099519fabfd3f70ec7a3106ac80fab62174 Mon Sep 17 00:00:00 2001 From: qiyueshiyi Date: Thu, 16 Feb 2017 15:33:37 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20permission=20=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E9=BB=98=E8=AE=A4=E5=AF=BC=E5=85=A5=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=9D=83=E9=99=90,=20=E6=B7=BB=E5=8A=A0=20--all=20=E9=80=89?= =?UTF-8?q?=E9=A1=B9=E7=94=A8=E4=BA=8E=E5=AF=BC=E5=85=A5=E6=89=80=E6=9C=89?= =?UTF-8?q?=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Member/Commands/PermissionCommand.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Member/Commands/PermissionCommand.php b/src/Member/Commands/PermissionCommand.php index 13db0eac..97220d02 100644 --- a/src/Member/Commands/PermissionCommand.php +++ b/src/Member/Commands/PermissionCommand.php @@ -23,6 +23,7 @@ class PermissionCommand extends Command protected $signature = 'permission {key? : Register permission config file path key.} {--path= : From file create permission.} + {--all : Export all permissions to database} {--force : Force create}'; protected $description = 'Export Permissions to database'; @@ -57,8 +58,8 @@ class PermissionCommand extends Command $permissions = (array) require $path; } - // 如果没有指定某个权限文件, 就执行导入所有注册的权限文件 - if (! $this->argument('key') && ! $this->option('path')) { + if ($this->option('all')) { + $permissions = []; $paths = $this->permissionManager->getFilePaths(); foreach ($paths as $path) { if (empty($path) || ! file_exists($path)) { -- Gitee