Diskuze: Stále přihlášení
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Hm, 2x tě to přesměruje? Kontroluješ ještě někde zda je uživatel přihlášen?
Tedy pokud nebude tak tě to přesměruje a až po té tě to zkontroluje pokud má cookie.
BTW: Ve funkci argument $cookie, nemusíš mít. Koukám, že globální pole voláš přímo v ní.
Ano, kontroluju ještě v předaném kontrolleru jestli je uživatel opravdu
přihlášen
napr. admincontroller
if (!$_SESSION["logged"])
{
$this->redirect("login");
exit;
}
Ale to si myslím že v tom sledu jak to je by mělo být ok.
RouterController
kontrola cookie popr. prihlaseni
predani akce danemu kontroleru napr. Admincontroller a v nem
kontrola jestli je opravdu prihlasen
Tak to zkontroluj tam:
if(!$_SESSION["logged"]){
if(($_COOKIE["trvale_prihlaseni"])){
$UsersManager = new UsersManager($lang);
$UsersManager->auto_login($_COOKIE["trvale_prihlaseni"]);
$this->redirect(""); //Přesměrování na aktuální page, lepší to zakomponovat do funkce still_login()
}else{
$this->redirect("login");
exit;
}
}
Také ti doporučuji, exit; umístit do funkce redirect pod header, kterým
provádíš přesměrování. Tento skript, by se měl nacházet pouze jednou v
celé aplikaci, není to podmínkou, ale doporučuje se to..
Tve řešení je dobré taky mne napadlo ale je to spíše obejítí toho že
ta prvni varianta je v něčem špatně. A to bych musel mit potom v kazdem
controlleru toto overeni, coz mi prijde zbytecne tam bych nechal pouze ten login
pokud je vyzadovan.
Jinak ten exit mam i ve funkci redirect takze tady to zbytecne tupluju.
Ukaž tedy tu první variantu, kde to máš globálně tedy v hlavním kontroleru či routeru? Nevím, jak tvůj kód přesně vypadá.
Kousek z routercontroller.php z pracovovni verze dle místního tutorialu
protected $Controller;
public function process($parameters)
{
Global $config;
$parsingURL = $this->parseUrl($parameters[0]);
if (($parsingURL[0] == "en") OR ($parsingURL[0] == "de"))
{
$lang = array_shift($parsingURL);
$this->lang = $lang;
}
$actual_page = implode("/", $parsingURL);
/* home page */
if (empty($parsingURL[0]))
{
$parsingURL[0] = "report";
}
if (($parsingURL[0] == "admin") AND ($parsingURL[1] != ""))
{
array_shift($parsingURL);
$classController = $this->pomlckyDoVelbloudiNotace(array_shift($parsingURL)). "AController";
$dir = "controllers/admin";
}
else
{
$classController = $this->pomlckyDoVelbloudiNotace(array_shift($parsingURL)). "Controller";
$dir = "controllers";
}
if (file_exists($dir . "/" . $classController .".php"))
{
$this->Controller = new $classController;
if (isset($lang))
{
$this->Controller->lang = $lang;
}
}
else
{
$this->redirect("error404");
}
/* kontrola jestli se ma uživatel automaticky logovat */
if (($_COOKIE["trvale_prihlaseni"]) AND (!$_SESSION["logged"]))
{
$UsersManager = new UsersManager($lang);
$UsersManager->auto_login($_COOKIE["trvale_prihlaseni"]);
}
/* předání potřebného controlleru */
$this->Controller->process($parsingURL);
$this-data......
.....
$this->view = "layout";
Tak to použij pouze zde, když načítáš pohledy, tak to zkontroluješ ještě před tím a je to. 2x to není potřeba, zkontroluješ sušenku a bude.
tak jsem to trosku predelal ale porad zadny uspech
v danem kontroleru kde mam potrebu prihlaseni volam
$this->is_login($_SERVER["REQUEST_URI"]);
v hlavnim kontrolleru controller.php ze ktereho dedim jsem pridal
/* overeni prihlaseni */
public function is_login($url)
{
/* kontrola jestli se ma uživatel automaticky logovat */
if (($_COOKIE["trvale_prihlaseni"]) AND (!$_SESSION["logged"]))
{
$UsersManager = new UsersManager($this->lang);
$UsersManager->auto_login();
// $this->redirect(ltrim($url, "/"));
}
if (!$_SESSION["logged"])
{
$this->redirect("login");
}
}
Ale problém mám pořád stejný vyhodí mně to vždy na ten login a po dalším obnovení to jde jak má. Pokud odkomentuju ten redirect tak si vytvořím smyčku při přesměrování.
Zkus toto, tohle by mohlo fungovat:
public function is_login($url){
if(!isset($_SESSION["logged"])){ //Není zalogován
/* kontrola jestli se ma uživatel automaticky logovat */
if(isset($_COOKIE["trvale_prihlaseni"])){ //Existuje-li sušenka
$UsersManager = new UsersManager($lang);
$UsersManager->auto_login($_COOKIE["trvale_prihlaseni"]);
$this->redirect(ltrim($url, "/")); //tvůj přesměrovač
}else{ //Sušenka není, přesměrujeme na login page
$this->redirect("login");
exit;
}
}
}
EDIT: A kde to testuješ 2x tak to zkus zakomentovat a testuj přihlášení pouze zde.. Resp. funkci volej tam kam to chceš.
Zdar...
máš hned na úvodní stránce spuštěné Session nebo se až
dotazuješ?
Já měl podobný problém, a vyřešil jsem to spuštěním session hned na
první stránce s PHP scriptem. Zkus to...
session_start();
Zúčastněným děkuji za pomoc, přineslo mi to spousta poznatků. Ale
nakonec stačilo upravit nastaveni cookies na
z
setcookie("trvale_prihlaseni",$_SESSION["user"]["id"].":".$token, strtotime("+1 month"));
na
setcookie("trvale_prihlaseni",$_SESSION["user"]["id"].":".$token, strtotime("+1 month"), "/");
cookie se vlastně nevytvářela nikdy na stejné adrese, takže jsem ji dal vždy na celou doménu a je to bez problémů.
Zobrazeno 12 zpráv z 12.