21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
Pavel Prochazka.zde.cz
Profil *
Zdraim,
mate nejake napady pro realizaci defaultni stranky? Jde me o toto:
Kdyz se urivatel prihlasi do webu tak ma pristup na chranene stranky, ale kdy neni prihlasen a pouzije url treba z historie, tak se nic nezobrazi. Protoze nejsou nastaveny konkretni promenne. tak by me zajimalo jak v pripade kdy uzivatel nema dostatecni prava udelat zobrazeni zakladni stranky. Moc se me nechce prochazet jednu fce za druhou a vsade kde je test inkriminovanych promennych davat neco jako:

else default_page();


function default_page (){
header("location: index.php");
}



napadlo me neco jako v zahlavi stranky, udelat test zda je vystup prazdny a pokud ano tak provest :

default_page();


Ale nemam tuseni jak provest test zda vystup je prazdny, nebo mate lepsi napad jak toto realizovat?
Mastodont
Profil
Úplně jednoduše, prostě vypiš všechno, co má být vidět i bez přihlášení, a zbytek přes něco jako if ( $_SESSION['user_logged'] )
Pavel Prochazka.zde.cz
Profil *
Mastodont no jo, ale takhle to nejde, kdy prijdu treba do sekce mazani, nebo upravu zaznamu a podobne. To by se vytisklo jen prostredi webu bez jeho obsahu. coz vypada tak divne neprofesionalne, sfusovane... Radsi bych v takovem pripade chtel provest skok na default page....
Mastodont
Profil
Možnost mazání nebo úpravy záznamu snad má jen příslušně autorizovaný júsr, ne? Ostatní uvidí jen záznam bez těchto tlačítek.
Pavel Prochazka.zde.cz
Profil *
Mastodont nenene, Ostatni nemaji co delat na techto strankach. to jako by si mohly treba prohlizet emaily ale nemohly by si je mazat. to je stejny pripad, proste se nesmeji dostat vubec do te schranky. V takovem pripade se presmeruji na nejakou zakladni stranky, tak jak to funguje treba na atlasu. Kdyz se prihlasim do emaily a kliknu na email, tak se vygeneruje url s parametrama a pokud je uzivatel prihlasen, tak vidi svoje emaily, pokud neni prihlasen, tak nema zde co pohledavat a je presmerovan na zakladni stranku, toto chci udelat. Jen se me nechce delat treba toto:

function administrace_delete($id, $nazev_tabulky){
if (isset($_POST['delete_id'])){
if (trim($_POST['delete_id']) == "delete"){ // radsi vetsi kontrola... :).
if (isset($_POST['delete_yes'])){
if (isset($_SESSION["JeAdmin"])){
if (($_SESSION["JeAdmin"]) == "1"){ // smazat jen kdyz je admin=1
if (isset($_SESSION["delete_id"])){
$id = $_SESSION["delete_id"];
$rnt = mysql_query ("delete from $nazev_tabulky where id=".$id.";", $GLOBALS["link"]);
Optimize_table ("$nazev_tabulky");
unset ($_SESSION["delete_id"]);
}
} else default_page();
} else default_page();
} else default_page();
} else default_page();
header("location: index.php?clanek=administrace");
} else PotvrzeniMazani("clanek=administrace_delete", $id);
}


ten kod na konci vypada odporne.... same:
} else default_page(); 

a kdyz treba zapomenu treba toto osetrit, tak se zase zobrizi, respektive nezobrazi nic....
Mastodont
Profil
No tak prostě na začátku stránky udělej kontrolu oprávnění a když nevyhoví, přesměruj na výchozí stránku. Tahle funkce je fakt šílená :-)
Pavel Prochazka.zde.cz
Profil *
Mastodont toho jsem se chtel vyhnout, to musim upravit vsechny funkce a pridavat "zbytecny" kod do budoucich fce... takze ten kod bude uplne stejny jaky jsem uvedl.... Nazacatku nejde nic testovat, protoze to bude vypadat nesystemove, nejpepsi konstrukce je IF -- ELSE...
Mastodont
Profil
Dělej, jak myslíš. V každým případě bych já ty podmínky spojil přes && a else default_page() bych tam měl jednou :-)
Pavel Prochazka.zde.cz
Profil *
Mastodont to nejde, protoze ta funkce se vola dvakrat! Poprve se zobrazi dotaz zda opravdu smazat a po druhem volani se teprve provede samotne mazani...

po uprave to vypada takto:
function administrace_delete($id, $nazev_tabulky){

if (isset($_POST['delete_id'])){
if (trim($_POST['delete_id']) == "delete"){ // radsi vetsi kontrola... :).
if (isset($_POST['delete_yes']) and isset($_SESSION["JeAdmin"]) and $_SESSION["JeAdmin"] == "1"){
if (isset($_SESSION["delete_id"])){
$id = $_SESSION["delete_id"];
$rnt = mysql_query ("delete from $nazev_tabulky where id=".$id.";", $GLOBALS["link"]);
Optimize_table ("$nazev_tabulky");
unset ($_SESSION["delete_id"]);
}
} else default_page();
} header("location: index.php?clanek=administrace");
} else PotvrzeniMazani("clanek=administrace_delete", $id);
}


ale porad je treba projit kazdou fce a doplnit odskok na defaultni stranku....
Radsi bych uvitel nejake globalni reseni....
Mastodont
Profil
Obávám se, že bys musel úplně přepsat kód, kdyby chtěl mít nějaké globální řešení.

Já bych už v controlleru podle akce z URL kontroloval oprávnění k jejímu provedení a když by to neprošlo, volal bych tu default page ...
Pavel Prochazka.zde.cz
Profil *
tedka jsem si uvedomil ze to takto nejde resit protoze kdyz provedu toto:
isset($_SESSION["JeAdmin"]) and $_SESSION["JeAdmin"] == "1")

a promenna JeAdmin neexistuje tak u druhe podminky nastane chyba!
Mastodont
Profil
isset($_SESSION["JeAdmin"]) and $_SESSION["JeAdmin"] == "1")


Ona ta session proměnná může mít jinou hodnotu než 1? Proč?
Pavel Prochazka.zde.cz
Profil *
Mastodont pokud existuje je admin, tak uzivatel je prihlasen, Pokud je jeadmin == 1 tak je admin, pokud je admin == 0 je to uzivatel....


Já bych už v controlleru podle akce z URL kontroloval oprávnění k jejímu provedení a když by to neprošlo, volal bych tu default page ...
to take delam, jen se tato obsluha provadi v kazde fce po rozdeleni...
Tak tedka jste me privedl na genialni myslenku :).

V kazdem modulu to rozdeluji napriklad takto:
if (isset($_REQUEST['funkce'])) {

switch ($_REQUEST["funkce"]) {
case "administrace_anketa";
administrace_ankety();
break;
case "edit_anketa";
list($id, $sCrc) = explode(".", Dekodovani_Dat($_REQUEST["id"]));
if ($sCrc == crc) {
Edit_anketa($id);
}
break;
case "delete_anketa";
if (isset($_REQUEST["id"])) {
list($id, $sCrc) = explode(".", Dekodovani_Dat($_REQUEST["id"]));
} else $sCrc = crc;
if ($sCrc == crc) {
delete_anketa($id);
}
break;
case "add_zaklad_anketa";
add_zaklad_anketa();
break;
case "add_edit_anketa";
add_edit_anketa();
break;
case "add";
Add_anketa_NOW();
break;
case "add_odpovedi_anketa";
add_odpovedi_anketa();
break;
case "ulozit_anketa";
ulozit_anketa();
break;
case "hlasuj_anketa";
hlasuj_anketa($_REQUEST["id"], crc, IP_TimeOut);
break;
}
}

A staci jen provest patricne osetreni u modulu a ne kazde fce zvlast..... To asi bude to co hledam....
Uvidim zda nebude v teto myslence nejaky kamen urazu....
Mastodont
Profil
Ano, to je něco jako kontrolér, akorát "pravý" kontrolér to nedělá v každém modulu, ale po přijetí požadavku na každou stránku (je ovšem nutné mod_rewrite)...

Pokud je jeadmin == 1 tak je admin, pokud je admin == 0 je to uzivatel....

Nevidím důvod, proč by logická proměnná měla mít dvě hodnoty. Když je to admin, tak $_SESSION["JeAdmin"] nastavím na LIBOVOLNOU hodnotu. Pokud je to jen uživatel, ta tu proměnnou nebudu vytvářet. Pak už stačí kontrolovat jen isset($_SESSION["JeAdmin"]) - když vrátí true, je to admin, když false, je to uživatel. Ta druhá kontrola je zbytečná.
Pavel Prochazka.zde.cz
Profil *
Mastodont ale potom nerozlisim prihlaseny , neprihlaseny a admin
Pavel Prochazka.zde.cz
Profil *
Ano, to je něco jako kontrolér, akorát "pravý" kontrolér to nedělá v každém modulu, ale po přijetí požadavku na každou stránku (je ovšem nutné mod_rewrite)... tomuto nejak nerozumim....
Mastodont
Profil
ale potom nerozlisim prihlaseny , neprihlaseny a admin

Pak to ale není proměnná true/false a neměla by se jmenovat JeAdmin (je/není), ale spíš TypUzivatele nebo tak nějak ...

U aplikací využívajících MVC jsou všechny requesty zachytávány v tzv. front controlleru, ten provádí tu kontrolu ve stylu switch ($_REQUEST["funkce"]) a podle výsledku pak volá další moduly.
Pavel Prochazka.zde.cz
Profil *
Mastodont
Ano, to je něco jako kontrolér, akorát "pravý" kontrolér to nedělá v každém modulu, ale po přijetí požadavku na každou stránku
Ten switch je akorat rozdelen do nekolikati formulazu, jinak se to chova jako jeden. Ma to vyhodu vtom ze vsechno co je potreba pro chod jednoho modulu je v jednom souboru... Potom sprava takoveho webu je jednodussi. Proste se vezme pozadovany modul a pouze upravi. Aniz by to zanechalo nasledky na zbytku webu pokud se neco pokazi. Neni treba hledat kde ta funkce je umistena a podobne...
BetaCam
Profil
A nebylo by výhodnější nacpat to do třídy? do konstruktoru nacpat ověření jestli je admin pokud neni redirect pokud je tak treba ten tvuj switch a vněm už volat jenom metody

$this->add_zaklad_anketa();
$this->add_odpovedi_anketa();
Pavel Prochazka.zde.cz
Profil *
BetaCam mozna ano, ale neumim programovat objektove....
To vypada velice dobre....
Pokud to vice rozvinete, tak to predelam....
Mastodont
Profil
Do třídy to má význam dávat, když člověk využije přednosti OOP, jinak ne. Třeba pro přístup k DB je OOP hodně dobré.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0