Интересува ме система, която примерно един администратор да дава индивидуални права за всеки потребител за всеки модул в сайта. Т.е. примерно влиза някой регистрира се като обикновен потребител. Има си глобални права, които са фиксирани с чекиране. Примерно таблицата ми е с име roles
вътре имам полета:
Това са един вид роли с главни права.
Имам и таблица users_roles където имам 3 полета:
Но искам освен тези глобалните права, които са от таблица users_roles да давам и ръчни права отделни. Имам таблица users_roles_custom с полета (последното поле/permissions/ ми е json_encode() на последователния номер на колоната и името на полето от таблица users):
Чудя се и се мая как да направя следното. Значи логвам се в системата и имам клас в който се изпълнява функция, която проверява дали има запис във users_roles_custom. Искам като провери там да ограничава, само страницата ми, която е вързана към тази таблица. Името на таблицата от таблица tables ми съвпада с page в страницата.
Ето я и функцията...
Първо проверявам с checkRoles($user_id(логнатия потребител)) и искам да ограничи един вид само до това, което е в custom добавено. А ако влиза потребителя в друга страница съответно да прескача това от custom след като не върне резултата и да гледа глобалните права... и съответно искам да ползвам и тези полета зададените в roles. Т.е. потребителя може да е guest без права или по просто казано false, но да мога като му дам права в users_roles_custom да не гледа, че има ниски права глобални. Т.е. в users_roles_custom е сложен да е администратор на таблица users както съм показал в примера по-горе. Има права администраторски до users но всичко друго му е ограничено.
Същото и обратното ако е модератор да мога да му слагам права блокиран до таблица users. Т.е. в users_roles_custom да е с role_id 3 и съответно му взима от роля Guest 5 x "false" и не му позволява да вижда нищо от таблица users даже и линка в менюто където води в потребители. Въпроса ми е конкретно за това как да направя проверката, ако трябва и някоя друга функция ще се напише
вътре имам полета:
PHP:
[b]role_id | role_path | role_en | role_bg | add | read | write | delete | filter[/b]
1 | admin | Administrator | Администратор | true | true | true | true | true
2 | moderator | Moderator | Модератор | true | true | true | false | false
3 | guest | Guest | Гост | false | false | false | false | false
Това са един вид роли с главни права.
Имам и таблица users_roles където имам 3 полета:
PHP:
users_role_id | user_id | role_id
1 | 1 | 1
2 | 2 | 3
Но искам освен тези глобалните права, които са от таблица users_roles да давам и ръчни права отделни. Имам таблица users_roles_custom с полета (последното поле/permissions/ ми е json_encode() на последователния номер на колоната и името на полето от таблица users):
PHP:
[b]users_roles_custom_id | user_id | role_id | table_id | permissions
1 | 2 | 1 | 1(където id ми съответства на ID от таблица tables) | {"1":"username","2":"password","3":"email","4":"theme","5":"signature","6":"signature_format","7":"created","8":"access","9":"login","10":"status","11":"timezone","12":"language"}[/b]
Чудя се и се мая как да направя следното. Значи логвам се в системата и имам клас в който се изпълнява функция, която проверява дали има запис във users_roles_custom. Искам като провери там да ограничава, само страницата ми, която е вързана към тази таблица. Името на таблицата от таблица tables ми съвпада с page в страницата.
Ето я и функцията...
PHP:
private function checkGlobalRoles($user_id = '') {
global $sql;
$check = $sql->query("
SELECT
r.add,
r.read,
r.write,
r.delete,
r.filter
FROM `users_roles` ur
JOIN `roles` r ON r.role_id = ur.role_id
WHERE ur.user_id = '".$user_id."'
LIMIT 1
");
if(!empty($check))
return $check[0]['r'];
else
return false;
}
function checkRoles($userID = '', $table = '') {
global $sql;
$this->userID = $userID;
$this->table = $table;
$check = $sql->query("
SELECT
r.add,
r.read,
r.write,
r.delete,
r.filter,
t.table_name
FROM `users_roles_custom` urc
JOIN `roles` r ON r.role_id = urc.role_id
JOIN `tables` t ON t.table_id = urc.table_id
AND urc.user_id = '".$this->userID."'
AND t.table_name LIKE '".$this->table."'
LIMIT 1
");
if(empty($check)) {
$check_global = $this->checkGlobalRoles($this->userID);
if($check_global)
return $check_global;
else
return false;
}elseif(!empty($check)) {
if($check[0]['r']['table_name'])
return $check[0]['r'];
else
return false;
}
}
Първо проверявам с checkRoles($user_id(логнатия потребител)) и искам да ограничи един вид само до това, което е в custom добавено. А ако влиза потребителя в друга страница съответно да прескача това от custom след като не върне резултата и да гледа глобалните права... и съответно искам да ползвам и тези полета зададените в roles. Т.е. потребителя може да е guest без права или по просто казано false, но да мога като му дам права в users_roles_custom да не гледа, че има ниски права глобални. Т.е. в users_roles_custom е сложен да е администратор на таблица users както съм показал в примера по-горе. Има права администраторски до users но всичко друго му е ограничено.
Същото и обратното ако е модератор да мога да му слагам права блокиран до таблица users. Т.е. в users_roles_custom да е с role_id 3 и съответно му взима от роля Guest 5 x "false" и не му позволява да вижда нищо от таблица users даже и линка в менюто където води в потребители. Въпроса ми е конкретно за това как да направя проверката, ако трябва и някоя друга функция ще се напише