Трябва ми advanced система за права

djpatzo

Registered
Интересува ме система, която примерно един администратор да дава индивидуални права за всеки потребител за всеки модул в сайта. Т.е. примерно влиза някой регистрира се като обикновен потребител. Има си глобални права, които са фиксирани с чекиране. Примерно таблицата ми е с име roles

вътре имам полета:



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 даже и линка в менюто където води в потребители. Въпроса ми е конкретно за това как да направя проверката, ако трябва и някоя друга функция ще се напише
 

Back
Горе