[php] generowanie linkow w zaleznosci od uprawnien usera

0

tworze sobie prywatnego homepage w php. zalozmy, ze mam na serwerze pliki A, B, C, chce aby jeden uzytkownik mial dostep tylko do pliku A inny do pliku A i B ale nie C itd.

mam juz zarzadzanie kontami oparte na mysqlu. ale jak generowac stronke z linkami w zaleznosci od uprawnien uzytkownika? hardcorowo: sztywna lista z plikami recznie uaktualniana? dla kazdego pliku tabela w mysqlu z lista dopuszczonych uzytkownikow?

ewentualne rozwiaznie w jscript odpada.

0

A nie lepiej na poczatku każdej strony sprawdzać w bazie uprawnienia i w zależności od nich wyświetlać odpowiednie pliki? Przechowywanie tego w sesji nie jest zabezpieczne. Wtedy do każdego pliku dorzucasz tylko jakie są uprawnienia potrzebne.

0

no np tak, bierzesz sobie nowy plik i includujesz go wszędzie po wyjęciu danych sesji:

<?php

define('MOZE_PIERWSZA_STRONE', 1); // pow(2, 0)
define('MOZE_DRUGA_STRONE', 2); // pow(2, 1)
define('MOVE_TRZECIA_I_CZWARTA_STRONE', 4); // pow(2, 2);

$page_min_prvs = Array(
  '/strona1.php' => MOZE_PIERWSZA_STRONE,
  '/strona2.php' => MOZE_DRUGA_STRONE,
  '/strona3.php' => MOVE_TRZECIA_I_CZWARTA_STRONE,
  '/strona4.php' => MOVE_TRZECIA_I_CZWARTA_STRONE
);

// to powyżej np wyciągnąć z mysqla (zamiast stałych od razu rypać w bazie wielokrotność potęgi 2)

define('this_page', strtolower($_SERVER['SCRIPT_NAME']));

function can_access($page){
  $page = strtolower($page); // case insensitive

  $have = is_empty($_SESSION['privileges']) ? 0 : intval($_SESSION['privileges'];
  $need = in_array($page, $page_min_prvs) ? $page_min_prvs[$page] : 0;

  return ($have & $need) == $need;
}


if(!can_access(this_page){
  Header('Status: 403 Forbidden');
  Die();
}

?>

przy logowaniu pobrać wartość pola z bazy do $_SESSION['privileges'] (najlepiej na każdej podstronie)

na stronie przy generowaniu linków:

<?php

function linkto($page, $an){
  return can_access($page) ? '<a href="' . $page . '">' . $an . '</a><br />' : '';
}

?>
<?= linkto('/strona1.php', 'Link do pierwszej strony') ?>
<?= linkto('/strona2.php', 'Link do drugiej strony') ?>
<?= linkto('/strona3.php', 'Link do trzeciej strony') ?>
<?= linkto('/strona4.php', 'Link do czwartej strony') ?>
<?php
  if(can_access('/fotka.jpg'))
    echo '<img src="fotka.jpg" />'; // tajne foto <lol>
?>

a panel admina przy przypisywaniu mógłby wyglądać np tak:

<?php
$prvls = Array();

foreach($page_min_prvs as $strona => $prvl)
  $prvls[$prvl][] = $strona;

foreach($prvls as $prvl){
  ?>
  <label><input name="przywilej[]" value="<?= $prvl ?>" type="checkbox"><?php
  
  foreach($prvl as $strona)
    echo $strona . '; ';

  ?></label><br /><?php
}
?>

a zapisanie:

<?php

$new_prvls = 0;

foreach($_POST['przywilej'] as $prvl)
  $new_prvls |= intval($prvl);

mysql_query('UPDATE usery SET przywileje = ' . $new_prvls . ' WHERE id = ' . $id);

?>

to jest wszystko taki pseudokodowy zarys a poza tym przy liczbie 32 bitowej może zabezpieczyć tylko 32 strony ;P ale gdyby przetrzymywać uprawnienia każdemu w większej liczbie albo np w kilku liczbach to by było więcej, albo jako tekst i już nie ma problemu

pisałeś że sztywna lista plików ręcznie uaktalniana to hardcorowe rozwiązanie więc możesz trochę przerobić i na początku pliku każdego napisać jaki przywilej mu jest potrzebny ale wtedy w innych plikach byś musiał otwierać ten plik i odczytać te dane, bo inaczej nie wiadomo czy wyświetlić do tego pliku linka - poza tym musisz pamiętać ostatnią liczbę uprawnień żeby nie nadać tego samego więc po długim czasie jakbyś zapomniał i chciał dodać nowy plik to byś musiał przejrzeć wszystkie pliki jakie miały już uprawnienia - dla mnie to jest bardziej hardcorowe rozwiązanie

czemu w sesji niebezpiecznie ? nieuprawniony user może zmienić dane w sesji tak samo jak w bazie danych czyli jeśli ani w skrypcie ani w serwerze nie ma dziury to nijak

// a jak userów "uprawnionych" jest bardzo mało to możesz zrobić tabelke

page_id | user_id

i dodawać tak parami

0

Ja byłbym za rozwiązaniem z regułami.
Tworzysz tabele np tbl_rules z polami file, rule, id.
Potem dodajesz reguły (nowe rekordy w tej tabeli) dla każdego pliku wg zasady:

RULE  | ID   | Opis
------+------+-----------------
ALLOW | NULL | Plik dostępny dla wszystkich
ALLOW |  nr  | Plik dostępny dla użytkownika nr
DENY  | NULL | Plik niedostępny dla wszystkich
DENY  |  nr  | Plik niedostępny dla użytkownika nr
  • pole file może zawierać nazwę pliku lub jego ID (z innej tabeli np. tbl_files)
  • pole id może odnosić się do użytkownika lub grupy (lepiej to drugie). Zawsze można podać kilka ID w stylu "ID1|ID2|ID3" i rozdzielić explodem.
  • przy dodawaniu nowego pliku, od razu można zrobić combo box + edit do ustalenia reguł.
0

Można też użyć zasad stosowanych natywnie w systemach unixowych - prawa dla właściciela, grupy i wszystkich, oraz przynależność użytkowników do grup i własność każdego pliku. Wszystko zależy od tego, jakiego typu uprawnienia potrzebujesz. Jest jeszcze opcja, że stosujesz prawa podobne do tych windowsowych. Każdy plik połączony z każdym użytkownikiem rekordem tabeli pośredniej określającej uprawnienia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1