2020-08-04 11:25:22 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Authorization;
|
2020-07-31 16:05:10 +00:00
|
|
|
|
2021-05-12 14:00:25 +00:00
|
|
|
use Myth\Auth\Authorization\PermissionModel as MythAuthPermissionModel;
|
|
|
|
|
|
|
|
class PermissionModel extends MythAuthPermissionModel
|
2020-07-31 16:05:10 +00:00
|
|
|
{
|
|
|
|
/**
|
2021-05-19 16:35:13 +00:00
|
|
|
* Checks to see if a user, or one of their groups, has a specific permission.
|
2020-07-31 16:05:10 +00:00
|
|
|
*/
|
2021-05-19 16:35:13 +00:00
|
|
|
public function doesGroupHavePermission(int $groupId, int $permissionId): bool
|
|
|
|
{
|
2020-07-31 16:05:10 +00:00
|
|
|
// Check group permissions and take advantage of caching
|
|
|
|
$groupPerms = $this->getPermissionsForGroup($groupId);
|
|
|
|
|
|
|
|
return count($groupPerms) &&
|
|
|
|
array_key_exists($permissionId, $groupPerms);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2021-05-19 16:35:13 +00:00
|
|
|
* Gets all permissions for a group in a way that can be easily used to check against:
|
2020-07-31 16:05:10 +00:00
|
|
|
*
|
2021-05-19 16:35:13 +00:00
|
|
|
* [ id => name, id => name ]
|
2020-07-31 16:05:10 +00:00
|
|
|
*
|
2021-05-06 14:00:48 +00:00
|
|
|
* @return array<int, string>
|
2020-07-31 16:05:10 +00:00
|
|
|
*/
|
|
|
|
public function getPermissionsForGroup(int $groupId): array
|
|
|
|
{
|
2021-04-20 13:43:38 +00:00
|
|
|
$cacheName = "group{$groupId}_permissions";
|
2021-05-19 16:35:13 +00:00
|
|
|
if (! ($found = cache($cacheName))) {
|
2020-07-31 16:05:10 +00:00
|
|
|
$groupPermissions = $this->db
|
|
|
|
->table('auth_groups_permissions')
|
|
|
|
->select('id, auth_permissions.name')
|
2021-05-19 16:35:13 +00:00
|
|
|
->join('auth_permissions', 'auth_permissions.id = permission_id', 'inner',)
|
2020-07-31 16:05:10 +00:00
|
|
|
->where('group_id', $groupId)
|
|
|
|
->get()
|
|
|
|
->getResultObject();
|
|
|
|
|
|
|
|
$found = [];
|
|
|
|
foreach ($groupPermissions as $row) {
|
|
|
|
$found[$row->id] = strtolower($row->name);
|
|
|
|
}
|
|
|
|
|
2021-05-19 16:35:13 +00:00
|
|
|
cache()
|
|
|
|
->save($cacheName, $found, 300);
|
2020-07-31 16:05:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return $found;
|
|
|
|
}
|
|
|
|
}
|