Администраторски панел с няколко левела на достъп

vinsbg

Registered
Здравейте,

не съм пробвал до сега и не знам точно как става това. Ще помоля за малко разяснения или някой урок, който да пробвам.

Искам да направя администраторски панел с няколко нива.
Ниво 1 - Супер администратор, който ще има достъп до абсолютно всичко.
Ниво 2 - Администратори, като тук ще са 4-5 администратора, които всеки ще си има една секция до която ще има достъп. Примерно администратор 1 има достъп до склад 1, който има различни отдели и само този администратор ще може да добавя и изтрива разни неща в този склад.

Админи панела ми е ясно как да си направя, но само с един админ, а не с различни нива на достъп.
Надявам се да съм обяснил правилно.
 
vinsbg каза:
Здравейте,

не съм пробвал до сега и не знам точно как става това. Ще помоля за малко разяснения или някой урок, който да пробвам.

Искам да направя администраторски панел с няколко нива.
Ниво 1 - Супер администратор, който ще има достъп до абсолютно всичко.
Ниво 2 - Администратори, като тук ще са 4-5 администратора, които всеки ще си има една секция до която ще има достъп. Примерно администратор 1 има достъп до склад 1, който има различни отдели и само този администратор ще може да добавя и изтрива разни неща в този склад.

Админи панела ми е ясно как да си направя, но само с един админ, а не с различни нива на достъп.
Надявам се да съм обяснил правилно.

Правиш си един клас admin в който имаш всички общи за администраторите опции, след което създаваш клас админ 1 който наследява общият клас и в него добавяш частта отговаряща за складовете, правиш клас админ 2 който пак наследява базовият клас и слагаш методите отговарящи за обработка на разделите след което правиш клас супер админ който наследява базовите методи общи за всички администратори и му добавяш методите за обработка на другите администратори и естествено правата които има. Където проверяваш дали даден абонат изобщо е администратор в полето просто ще добавиш още една двее цифри в базата и ще разграничаваш вида на администраторите. :)
 
Другия вариант, който може да е да не са администратори ( не е задължително условие ), но трябва всеки да има достъп до различни страници. Както казах страниците ще зареждат разна информация и там ще могат да изтриват, добавят, редактират от тази информация.. тя е в базата.
Някаккъв user profile...

Не успявам да намеря подходящш туториал.
 
vinsbg каза:
Другия вариант, който може да е да не са администратори ( не е задължително условие ), но трябва всеки да има достъп до различни страници. Както казах страниците ще зареждат разна информация и там ще могат да изтриват, добавят, редактират от тази информация.. тя е в базата.
Някаккъв user profile...

Не успявам да намеря подходящш туториал.
Ако не е задължително, направи клас USER който има някакви права и базови действия, след което примерно модератори го наследяват или потребители с различните права, които желаеш да имат след което правиш един администратор който наследява юзъра. Ако пък успееш така да си структурираш кода, че администратора да наследи модераторският клас ще си спестиш още доооста писане на код и да се получи една верига от права. :)
 
Добавяш в таблицата с потребителите едно поле "level" (примерно), което да е със стойности:

1 - за потребител
2 - за начален администратор
3 - за администратор със средни права
4 - за администратор с пълни права

И имаш после в admin.php (или както ти се казва файлът за админ панел)
PHP:
<?php
$query = mysql_query("SELECT * FROM `users` WHERE `username` = '$user'"); # примерна заявка
$info = mysql_fetch_array($query);
$level = $info['level'];
if($level == 1) die("Вие сте обикновен потребител");
elseif($level == 2){
echo "Вие сте начален администратор";
#останалата част от кода за такъв тип администратор
}
elseif($level == 3){
echo "Вие сте администратор със средни права";
#останалата част от кода за такъв тип администратор
}
else{
echo "Вие сте администратор с пълни права";
#останалата част от кода за такъв тип администратор
}
?>
 
Вдигам темата отново, защото нищо не успявам да направя.
В момента имам таблица `users` с полета user_id, username, password, email, usertype

В usertype имам:
1 - superadmin, който вижда абсолютно всичко и може да трие, добавя, редактира и т.н.
5 - admin_1, admin_2, admin_3, admin_4

Аз обаче имам 4 на брой админи - admin_1, admin_2, admin_3, admin_4.
Идеята е всеки админ да вижда само определен ред от таблиците. Примерно admin_1 ще вижда от таблица cars реда, който е с id=1.
admin_2 -> cars id=2 , admin_3 -> cars id=3 и т.н.
имам таблица `lodki` - admin_1 вижда само реда lodki id=1 и така за всички.

Признавам, че това, което dakata__92 обяснява с класовете и наследяването не мога да го разбера, затова търся може би по-бърз и достъпен вариант, как да го постигна..

едит:
Направих superadmin-a и е работещ вече. Има достъп до абсолютно всичко. Сега въпроса е как да се направят останалите..
 
Бих използвал Sentry 2.1 за тези фантасмагории..

Но..

Аз обаче имам 4 на брой админи - admin_1, admin_2, admin_3, admin_4.
Идеята е всеки админ да вижда само определен ред от таблиците. Примерно admin_1 ще вижда от таблица cars реда, който е с id=1.
admin_2 -> cars id=2 , admin_3 -> cars id=3 и т.н.
имам таблица `lodki` - admin_1 вижда само реда lodki id=1 и така за всички.

Тук достъпа ще го направиш на ниво cars или lodki.
Добавяш една колона permitted_users или нещо такова в таблиците cars и lodki.

На страницата на която ще добавяш / редактираш тези "обекти", можеш да добавиш един Multi Select (в случай, че искаш admin_1 и admin_2 да имат достъп до тях - случва се, може да си пиеш биричката с admin_1) който ще запълниш със списък на всички администратори.

Пример:
HTML:
<select name="permitted_users[]" multiple="multiple">
  <option value="1">admin_1</option>
  <option value="2">admin_2</option>
  <option value="45">admin_3</option>
</select>

Ако примерно избереш admin_1 и admin_3, $_POST масива ще изглежда така: $_POST['permitted_users'] = array('1', '45');

От тук нататък сериализираш с serialize / json_encode при INSERT или UPDATE и десериализираш с unserialize / json_decode при SELECT.

Проверката е проста:

Да кажем, че super admin-а ти има id = 1.

PHP:
<?php
if($user_id == 1 || in_array($user_id, $permitted_users)) {
	echo 'You can edit / delete this entry.';
} else {
	echo 'You cannot edit / delete this entry';
}
 
eLite каза:
Бих използвал Sentry 2.1 за тези фантасмагории..
Ще го прегледам.

Другото, което май не стана ясно, че на мен идеята ми е admin_1 да не вижда останалите редове от таблицата, със заявката, която си ми дал като пример ми се струва, че той ще ги вижда.

Нещо, което ми хрумна е дали няма да стане ако към всяка таблица добавя още едно поле 'user_permission' и в таблица users да добавя същото поле, където на всеки юзър ще сложа уникален номер. После в заявките на този потребител ще добавям ...WHERE user_permission = ...
Обаче при логин на юзъра трябва да пазе някъде стойсността на полето user_permission. Това дали би сработило?
 
vinsbg каза:
eLite каза:
Бих използвал Sentry 2.1 за тези фантасмагории..
Ще го прегледам.

Другото, което май не стана ясно, че на мен идеята ми е admin_1 да не вижда останалите редове от таблицата, със заявката, която си ми дал като пример ми се струва, че той ще ги вижда.

Нещо, което ми хрумна е дали няма да стане ако към всяка таблица добавя още едно поле 'user_permission' и в таблица users да добавя същото поле, където на всеки юзър ще сложа уникален номер. После в заявките на този потребител ще добавям ...WHERE user_permission = ...
Обаче при логин на юзъра трябва да пазе някъде стойсността на полето user_permission. Това дали би сработило?

По скоро отделна таблица за "много-към-много" връзка - http://www.phpknowhow.com/mysql/many-to-many-relationships/

В такъв случай, няма да ти трябва поле permitted_users.

Или когато показваш списъка със cars / lodki, просто прави същото:

PHP:
$pu = json_decode($row['permitted_users']);
if($userid = 1 || in_array($userid, $pu)) {
// Показва реда.
}
 
"Много към много" с цел да мога да свържа
Код:
table_1.id=1, table_2.id=1 и table_3.id=1 -> users.user_permission.id=1
примерно?
После
Код:
table_1.id=2, table_2.id=2, table_3.id=3 -> users.user_permission.id=2
и т.н.?
Реално на мен на всеки юзър id-то отговаря на id-то от таблицата, която искам. И така ще бъде и занапред.
 
vinsbg каза:
"Много към много" с цел да мога да свържа
Код:
table_1.id=1, table_2.id=1 и table_3.id=1 -> users.user_permission.id=1
примерно?
После
Код:
table_1.id=2, table_2.id=2, table_3.id=3 -> users.user_permission.id=2
и т.н.?
Реално на мен на всеки юзър id-то отговаря на id-то от таблицата, която искам. И така ще бъде и занапред.

Не, по скоро:

[sql]CREATE TABLE cars2users (
car_id INT(11) NOT NULL,
user_id INT(11) NOT NULL
)[/sql]

[sql]CREATE TABLE lodki2users (
lodka_id INT(11) NOT NULL,
user_id INT(11) NOT NULL,
)[/sql]

И:
[sql]SELECT * FROM `cars` AS c
LEFT JOIN `cars2users` AS c2u ON c.id = c2u.car_id
LEFT JOIN `users` AS u ON c2u.user_id = u.id[/sql]

[sql]SELECT * FROM `lodki` AS l
LEFT JOIN `lodki2users` AS l2u ON l.id = l2u.lodka_id
LEFT JOIN `users` AS u ON l2u.user_id = u.id[/sql]

За id-ta... Ти си знаеш. И аз бяха направил подобна грешка един път, след това имах главоболия.
 
eLite каза:
За id-ta... Ти си знаеш. И аз бяха направил подобна грешка един път, след това имах главоболия.
Да, това с ID-тата може да имам проблеми и да се омаже нещо при триене на потребител.. и после добавяне и т.н.

Ще пробвам това с междинната таблица. Няма да затварям темата все още, че да не пускам нова ако имам проблеми нещо.
Благодаря за сега.

едит:
А как да пазя id-то на потребителя, който се е логнал, за да знам, като предавам по страниците после на кое ID таблиците да заредя? Предполагам в логин формата?
В момента се логвам така
Код:
if(isSet($_POST['submit'])) {
    include('misc/db.inc.php');

    $username = $_POST['username'];
    $password = $_POST['password'];

    $query = mysqli_query($con, "SELECT * FROM users WHERE username='".addSlashes($username)."' AND password='".addSlashes($password)."'");
	 
	 
    $res = mysqli_fetch_array($query);

    if ($res['usertype'] == 1) {
        $_SESSION['username'] = $username;
        $_SESSION['password'] = $password;
        $_SESSION['userobj'] = mysqli_fetch_assoc($query);
	
	
        header('Location: admins/main.php');
        exit;
    	} elseif( $res['usertype'] == 5 ) 
    	{
	    header('Location: users/main.php');
            exit; 
	}
    	else {
	echo '<div style="text-align: center; margin-top: 10%"> Грешна парола или потребител <br /> <a href="index.php">Моля, опитайте отново</a></div> ';
    }
} else {
 
Нещо не успявам да наглася заявката. Талбиците:
users
Код:
id
...
usertype
и
cars
Код:
id
...
usertype
Третата таблица междинна е cars_user
Код:
car_usertype
user_usertype
И заявката, която се мъча е базирана на твоя пример
Код:
SELECT * FROM `cars` AS c
LEFT JOIN `cars_user` AS c2u ON c.cars_usertype = c2u.car_usertype
 	LEFT JOIN `users` AS u ON c2u.user_usertype = u.users_usertype

на междинната таблиза трябва ли да слагам foreign key?
 
Нищо... пробвах така
Код:
if (!$q) {
      die('Error: ' . mysqli_error($con));
}
И директно след заявката
Код:
or die("Errr" . mysqli_error($con))
Няма лог няма нищо за грешка.. без mysqli_error си показва, че expects parameter 1 to be mysqli_result, boolean given
 

Back
Горе