From a81f8567c08400c9dc48fa8a5382e4cca872e5c3 Mon Sep 17 00:00:00 2001 From: qiyueshiyi Date: Tue, 14 Feb 2017 18:08:33 +0800 Subject: [PATCH 1/5] Add permissions table and Permission model --- ..._02_14_000000_create_permissions_table.php | 41 +++++++++++++++++++ src/Member/Permission.php | 21 ++++++++++ 2 files changed, 62 insertions(+) create mode 100644 databases/migrations/2017_02_14_000000_create_permissions_table.php create mode 100644 src/Member/Permission.php diff --git a/databases/migrations/2017_02_14_000000_create_permissions_table.php b/databases/migrations/2017_02_14_000000_create_permissions_table.php new file mode 100644 index 00000000..0977b51d --- /dev/null +++ b/databases/migrations/2017_02_14_000000_create_permissions_table.php @@ -0,0 +1,41 @@ +schema->create('permissions', function (Blueprint $table) { + $table->increments('id'); + $table->string('name')->unique(); + $table->string('display_name')->nullable(); + $table->string('description')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $this->schema->dropIfExists('permissions'); + } +} diff --git a/src/Member/Permission.php b/src/Member/Permission.php new file mode 100644 index 00000000..6d3f05b9 --- /dev/null +++ b/src/Member/Permission.php @@ -0,0 +1,21 @@ + + * @copyright (c) 2017, iBenchu.org + * @datetime 2017-02-14 16:04 + */ + +namespace Notadd\Foundation\Member; + +use Notadd\Foundation\Database\Model; + +class Permission extends Model +{ + protected $table = 'permission'; + + protected $fillable = [ + 'name', 'display_name', 'description', + ]; +} -- Gitee From 09687e3b8da17550b52270df04a93e6f25ae7249 Mon Sep 17 00:00:00 2001 From: qiyueshiyi Date: Tue, 14 Feb 2017 18:46:23 +0800 Subject: [PATCH 2/5] =?UTF-8?q?Add=20member=5Fpermission=20table,=20?= =?UTF-8?q?=E7=BB=99=20Member=20model=20=E6=B7=BB=E5=8A=A0=E6=9D=83?= =?UTF-8?q?=E9=99=90=E7=9A=84=E7=9B=B8=E5=85=B3=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ..._02_14_000000_create_permissions_table.php | 7 + src/Member/Member.php | 171 ++++++++++++++++++ 2 files changed, 178 insertions(+) diff --git a/databases/migrations/2017_02_14_000000_create_permissions_table.php b/databases/migrations/2017_02_14_000000_create_permissions_table.php index 0977b51d..85894932 100644 --- a/databases/migrations/2017_02_14_000000_create_permissions_table.php +++ b/databases/migrations/2017_02_14_000000_create_permissions_table.php @@ -27,6 +27,12 @@ class CreatePermissionsTable extends Migration $table->string('description')->nullable(); $table->timestamps(); }); + + $this->schema->create('member_permission', function (Blueprint $table) { + $table->unsignedInteger('member_id'); + $table->unsignedInteger('permission_id'); + $table->primary(['member_id', 'permission_id']); + }); } /** @@ -36,6 +42,7 @@ class CreatePermissionsTable extends Migration */ public function down() { + $this->schema->dropIfExists('member_permission'); $this->schema->dropIfExists('permissions'); } } diff --git a/src/Member/Member.php b/src/Member/Member.php index 2cd188d9..f5852063 100644 --- a/src/Member/Member.php +++ b/src/Member/Member.php @@ -9,6 +9,7 @@ namespace Notadd\Foundation\Member; use Laravel\Passport\HasApiTokens; +use Illuminate\Support\Facades\Cache; use Notadd\Foundation\Auth\User as Authenticatable; /** @@ -35,6 +36,16 @@ class Member extends Authenticatable 'remember_token', ]; + /** + * 用户的权限 + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany + */ + public function permissions() + { + return $this->belongsToMany(Permission::class, 'member_permission', 'member_id', 'permission_id'); + } + /** * Get member instance for passport. * @@ -46,4 +57,164 @@ class Member extends Authenticatable { return $this->newQuery()->where('name', $name)->first(); } + + public function cachedPermissions() + { + $memberPrimaryKey = $this->primaryKey; + $cacheKey = 'permissions_for_member_' . $this->$memberPrimaryKey; + + return Cache::tags('member_permission')->remember($cacheKey, 60, function () { + return $this->permissions()->get(); + }); + } + + public function save(array $options = []) + { //both inserts and updates + $result = parent::save($options); + + Cache::tags('member_permission')->flush(); + + return $result; + } + + public function delete(array $options = []) + { //soft or hard + $result = parent::delete($options); + + Cache::tags('member_permission')->flush(); + + return $result; + } + + public function restore() + { //soft delete undo's + $result = parent::restore(); + + Cache::tags('member_permission')->flush(); + + return $result; + } + + /** + * Boot the role model + * Attach event listener to remove the many-to-many records when trying to delete + * Will NOT delete any records if the role model uses soft deletes. + * + * @return void|bool + */ + public static function boot() + { + parent::boot(); + + static::deleting(function($member) { + + if (! method_exists(static::class, 'bootSoftDeletes')) { + $member->permissions()->sync([]); + } + + return true; + }); + } + + /** + * Checks if the member has a permission by its name. + *cachedPermissions + * @param string|array $name Permission name or array of permission names. + * @param bool $requireAll All permissions in the array are required. + * + * @return bool + */ + public function hasPermission($name, $requireAll = false) + { + if (is_array($name)) { + foreach ($name as $permissionName) { + $hasPermission = $this->hasPermission($permissionName); + + if ($hasPermission && ! $requireAll) { + return true; + } elseif (! $hasPermission && $requireAll) { + return false; + } + } + + // If we've made it this far and $requireAll is FALSE, then NONE of the permissions were found + // If we've made it this far and $requireAll is TRUE, then ALL of the permissions were found. + // Return the value of $requireAll; + return $requireAll; + } else { + foreach ($this->cachedPermissions() as $permission) { + if ($permission->name == $name) { + return true; + } + } + } + + return false; + } + + /** + * Attach permission to current role. + * + * @param object|array $permission + * + * @return void + */ + public function attachPermission($permission) + { + if (is_object($permission)) { + $permission = $permission->getKey(); + } + + if (is_array($permission)) { + $permission = $permission['id']; + } + + $this->permissions()->attach($permission); + } + + /** + * Detach permission from current role. + * + * @param object|array $permission + * + * @return void + */ + public function detachPermission($permission) + { + if (is_object($permission)) + $permission = $permission->getKey(); + + if (is_array($permission)) + $permission = $permission['id']; + + $this->permissions()->detach($permission); + } + + /** + * Attach multiple permissions to current role. + * + * @param mixed $permissions + * + * @return void + */ + public function attachPermissions($permissions) + { + foreach ($permissions as $permission) { + $this->attachPermission($permission); + } + } + + /** + * Detach multiple permissions from current role + * + * @param mixed $permissions + * + * @return void + */ + public function detachPermissions($permissions) + { + foreach ($permissions as $permission) { + $this->detachPermission($permission); + } + } } -- Gitee From b70d005c15be8e43406775fe1987c16347709735 Mon Sep 17 00:00:00 2001 From: qiyueshiyi Date: Wed, 15 Feb 2017 10:57:22 +0800 Subject: [PATCH 3/5] =?UTF-8?q?Renamed=20create=5Fpermissions=5Ftable.php?= =?UTF-8?q?=20file,=20=E4=BF=AE=E6=94=B9=20Member::delete=20=E5=B8=A6?= =?UTF-8?q?=E4=BA=86=E5=8F=82=E6=95=B0,=20=E5=BC=95=E8=B5=B7=E5=AD=90?= =?UTF-8?q?=E7=B1=BB=E6=B2=A1=E5=B8=A6=E5=8F=82=E6=95=B0=E7=9A=84=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... 2016_09_26_174220_create_permissions_table.php} | 0 src/Member/Member.php | 13 ++++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) rename databases/migrations/{2017_02_14_000000_create_permissions_table.php => 2016_09_26_174220_create_permissions_table.php} (100%) diff --git a/databases/migrations/2017_02_14_000000_create_permissions_table.php b/databases/migrations/2016_09_26_174220_create_permissions_table.php similarity index 100% rename from databases/migrations/2017_02_14_000000_create_permissions_table.php rename to databases/migrations/2016_09_26_174220_create_permissions_table.php diff --git a/src/Member/Member.php b/src/Member/Member.php index f5852063..e07420fd 100644 --- a/src/Member/Member.php +++ b/src/Member/Member.php @@ -69,7 +69,8 @@ class Member extends Authenticatable } public function save(array $options = []) - { //both inserts and updates + { + //both inserts and updates $result = parent::save($options); Cache::tags('member_permission')->flush(); @@ -77,9 +78,10 @@ class Member extends Authenticatable return $result; } - public function delete(array $options = []) - { //soft or hard - $result = parent::delete($options); + public function delete() + { + //soft or hard + $result = parent::delete(); Cache::tags('member_permission')->flush(); @@ -87,7 +89,8 @@ class Member extends Authenticatable } public function restore() - { //soft delete undo's + { + //soft delete undo's $result = parent::restore(); Cache::tags('member_permission')->flush(); -- Gitee From 123dee7858fd16216e9e3a354d66e9732c865e40 Mon Sep 17 00:00:00 2001 From: qiyueshiyi Date: Wed, 15 Feb 2017 11:48:16 +0800 Subject: [PATCH 4/5] Add addPermission function Permission model, fix Permission table name wrong --- src/Member/Permission.php | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/Member/Permission.php b/src/Member/Permission.php index 6d3f05b9..5e9b0c69 100644 --- a/src/Member/Permission.php +++ b/src/Member/Permission.php @@ -11,11 +11,38 @@ namespace Notadd\Foundation\Member; use Notadd\Foundation\Database\Model; +/** + * Class Permission + * + * @property integer $id + * @property string $name + * @property string $display_name + * @property string $description + * @property \Carbon\Carbon|null $created_at + * @property \Carbon\Carbon|null $updated_at + * + * @package Notadd\Foundation\Member + */ class Permission extends Model { - protected $table = 'permission'; + protected $table = 'permissions'; protected $fillable = [ 'name', 'display_name', 'description', ]; + + public static function addPermission($name, $display_name = null, $description = null) + { + $permission = static::where('name', $name)->first(); + + if (! $permission || ! $permission->exists) { + $permission = new static(['name' => $name]); + } + + $permission->display_name = $display_name; + $permission->description = $description; + $permission->save(); + + return $permission; + } } -- Gitee From b9bccee49b1949f377735efb3db6cfa5e7a57ff6 Mon Sep 17 00:00:00 2001 From: qiyueshiyi Date: Wed, 15 Feb 2017 11:52:35 +0800 Subject: [PATCH 5/5] Add members function to Permission model --- src/Member/Permission.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Member/Permission.php b/src/Member/Permission.php index 5e9b0c69..ad47b7d8 100644 --- a/src/Member/Permission.php +++ b/src/Member/Permission.php @@ -31,6 +31,14 @@ class Permission extends Model 'name', 'display_name', 'description', ]; + /** + * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany + */ + public function members() + { + return $this->belongsToMany(Member::class, 'member_permission', 'permission_id', 'member_id'); + } + public static function addPermission($name, $display_name = null, $description = null) { $permission = static::where('name', $name)->first(); -- Gitee