I have small web application that need a users permissions system to access some content or add/edit it.
I'm using roles given to a user to manage priviliges, and also a user custom meta
to set a custom priviliges to a specific user.
I want to know if this method is good ? if not why ? Is there is any suggestion better than put priviligies in a array ? because is too long :( .
if(!function_exists('user_cap')) {
/**
*
*/
function user_cap( $user_id, $cap, $action, $accesable = null ) {
$get_user_info = get_user_info( $user_id );
$user_role = $get_user_info->user_role;
/**
* Super admin role can determine custom privileges for every user
*/
//$user_privileges = get_user_meta( $user_id, 'user_privileges' );
//
$privileges = [
'super_admin' => [
'users' => [
'create' => 'yes',
'read' => 'yes',
'update' => 'yes',
'delete' => 'yes'
],
'projects' => [
'create' => 'yes',
'read' => 'yes',
'update' => 'yes',
'delete' => 'yes'
],
'locations' => [
'create' => 'yes',
'read' => 'yes',
'update' => 'yes',
'delete' => 'yes'
],
'reminders' => [
'create' => 'yes',
'read' => 'yes',
'update' => 'yes',
'delete' => 'yes'
],
'administrations' => [
'create' => 'yes',
'read' => 'yes',
'update' => 'yes',
'delete' => 'yes'
],
'locations' => [
'create' => 'yes',
'read' => 'yes',
'update' => 'yes',
'delete' => 'yes'
],
],
'user' => [
'users' => [
'create' => 'no',
'read' => 'no',
'update' => 'no',
'delete' => 'no'
],
'projects' => [
'create' => 'no',
'read' => 'get_user_responsible_projects',
'update' => 'no',
'delete' => 'no'
],
'locations' => [
'create' => 'no',
'read' => 'no',
'update' => 'no',
'delete' => 'no'
],
'reminders' => [
'create' => 'yes',
'read' => 'get_user_reminders',
'update' => 'get_user_reminders',
'delete' => 'get_user_reminders'
],
'administrations' => [
'create' => 'no',
'read' => 'no',
'update' => 'no',
'delete' => 'no'
],
'locations' => [
'create' => 'no',
'read' => 'no',
'update' => 'no',
'delete' => 'no'
],
],
];
$role_privilege = $privileges[$user_role][$cap][$action];
if($privilegs == 'yes') {
return true;
}elseif($privilege == 'no') {
return false;
}else{
$privilege = call_user_func($privilege);
if(in_array($accesable, $privilege) {
return true;
}
}
return false;
}
}
if(!function_exists('user_can')) {
/**
* @param int $user_id
* @param string $cap
* @param string $action
*/
function user_can( $user_id, $cap, $action ) {
return user_cap( $user_id, $cap, $action );
}
}
if(!function_exists('current_user_can')) {
/**
* @param string $cap
* @parzm string $action
*
* @return mixed (string on success|boolean on failure)
*/
function current_user_can( $cap, $action ) {
$current_user = current_user();
if(empty($current_user)) {
return false;
}
return user_can($current_user->id, $cap, $action);
}
}