reorganize and cleanup php server code
This commit is contained in:
@@ -0,0 +1,191 @@
|
||||
<?php
|
||||
|
||||
namespace Vanguard\Support\Authorization;
|
||||
|
||||
use Cache;
|
||||
use Config;
|
||||
use Vanguard\Permission;
|
||||
|
||||
trait AuthorizationRoleTrait
|
||||
{
|
||||
/**
|
||||
* Get cached permissions for this role.
|
||||
* @return mixed
|
||||
*/
|
||||
public function cachedPermissions()
|
||||
{
|
||||
return Cache::remember($this->getCacheKey(), Config::get('cache.ttl'), function () {
|
||||
return $this->permissions()->get();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Override "save" role method to clear role cache.
|
||||
* @param array $options
|
||||
*/
|
||||
public function save(array $options = [])
|
||||
{
|
||||
$this->flushCache();
|
||||
parent::save($options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Override "delete" role method to clear role cache.
|
||||
* @param array $options
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function delete(array $options = [])
|
||||
{
|
||||
$this->flushCache();
|
||||
parent::delete($options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Override "restore" role method to clear role cache.
|
||||
*/
|
||||
public function restore()
|
||||
{
|
||||
$this->flushCache();
|
||||
parent::restore();
|
||||
}
|
||||
|
||||
/**
|
||||
* Many-to-Many relations with the permission model.
|
||||
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
|
||||
*/
|
||||
public function permissions()
|
||||
{
|
||||
return $this->belongsToMany(Permission::class, 'permission_role', 'role_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the role has a permission by its name.
|
||||
*
|
||||
* @param string $name Permission name.
|
||||
* @return bool
|
||||
*/
|
||||
public function hasPermission($name)
|
||||
{
|
||||
$perms = $this->cachedPermissions()->pluck('name')->toArray();
|
||||
|
||||
return in_array($name, $perms, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the inputted permissions.
|
||||
*
|
||||
* @param mixed $inputPermissions
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function savePermissions($inputPermissions)
|
||||
{
|
||||
if (! empty($inputPermissions)) {
|
||||
$this->permissions()->sync($inputPermissions);
|
||||
} else {
|
||||
$this->permissions()->detach();
|
||||
}
|
||||
|
||||
$this->flushCache();
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
$this->flushCache();
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
$this->flushCache();
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sync role permissions.
|
||||
* @param $permissions array Permission IDs.
|
||||
*/
|
||||
public function syncPermissions(array $permissions)
|
||||
{
|
||||
$this->permissions()->sync($permissions);
|
||||
|
||||
$this->flushCache();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get permissions cache key.
|
||||
* @return string
|
||||
*/
|
||||
private function getCacheKey()
|
||||
{
|
||||
return 'permissions_for_role_'.$this->{$this->primaryKey};
|
||||
}
|
||||
|
||||
/**
|
||||
* Flush cached permissions for this role.
|
||||
*/
|
||||
private function flushCache()
|
||||
{
|
||||
Cache::forget($this->getCacheKey());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
<?php
|
||||
|
||||
namespace Vanguard\Support\Authorization;
|
||||
|
||||
use Vanguard\Role;
|
||||
|
||||
trait AuthorizationUserTrait
|
||||
{
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
public function role()
|
||||
{
|
||||
return $this->belongsTo(Role::class, 'role_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if user has specified role.
|
||||
* @param $role
|
||||
* @return bool
|
||||
*/
|
||||
public function hasRole($role)
|
||||
{
|
||||
return $this->role->name === $role;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if user can perform some action.
|
||||
* @param $permission
|
||||
* @param bool $allRequired
|
||||
* @return bool
|
||||
*/
|
||||
public function hasPermission($permission, $allRequired = true)
|
||||
{
|
||||
$permission = (array) $permission;
|
||||
|
||||
return $allRequired
|
||||
? $this->hasAllPermissions($permission)
|
||||
: $this->hasAtLeastOnePermission($permission);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if user has all provided permissions
|
||||
* (translates to AND logic between permissions).
|
||||
*
|
||||
* @param array $permissions
|
||||
* @return bool
|
||||
*/
|
||||
private function hasAllPermissions(array $permissions)
|
||||
{
|
||||
$availablePermissions = $this->role->cachedPermissions()->pluck('name')->toArray();
|
||||
|
||||
foreach ($permissions as $perm) {
|
||||
if (! in_array($perm, $availablePermissions, true)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if user has at least one of provided permissions
|
||||
* (translates to OR logic between permissions).
|
||||
*
|
||||
* @param array $permissions
|
||||
* @return bool
|
||||
*/
|
||||
private function hasAtLeastOnePermission(array $permissions)
|
||||
{
|
||||
$availablePermissions = $this->role->cachedPermissions()->pluck('name')->toArray();
|
||||
|
||||
foreach ($permissions as $perm) {
|
||||
if (in_array($perm, $availablePermissions, true)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set user's role.
|
||||
* @param Role $role
|
||||
* @return mixed
|
||||
*/
|
||||
public function setRole($role)
|
||||
{
|
||||
return $this->forceFill([
|
||||
'role_id' => $role instanceof Role ? $role->id : $role
|
||||
])->save();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user