IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Martin Suchodol:21.1.2020 14:49

Ahoj, stále bujuji s aplikací na autorizaci uživatelů. Zřejmě jsem si ukousl příliš velké sousto na mé současné znalosti. Ale jelikož se učím tak to beru pozitivně. Níže přikládám kód.

Takže o co se snažím nyní. Zdánlivě vše funguje jak má, ale ve chvíli kdy se pokusím funkci authUser(). Parametry, tak dostanu vyhubováno viz název vlákna, podle chyby vypsané serverem se chyba nachází ve chvíli kdy předávám parametry. Ale když si si otestuji dotazy pomocí var_dump tak mi vyjde že jsou parametry skutečně poli a tudíž by mnělo být vše v pořádku

Níže přikládám kód a screeny.

public function getUserPermission($username) {
    return Db::queryAll('
    SELECT permission.role_name
    FROM `user_permission`
    JOIN user on user_permission.user_id = user.user_id
    JOIN permission ON user_permission.permission_id = permission.role_type_id
    WHERE user.user_name = ?
    ', array($username));
}

 public function getArticlePermission($url) {
    return Db::queryAll('
    SELECT permission.role_name
    FROM `article_permission`
    JOIN article on article_permission.article_id = article.article_id
    JOIN permission ON article_permission.permission_id = permission.role_type_id
    WHERE article.url = ?
    ', array($url));
}

public function authUser($articlePermission = array('user'), $userPersmission = array('user')) {
    $user = UserManager::$user;
    $result = (bool) array_intersect($articlePermission, $userPersmission);

    if(!$user || !$result) {
        if (!$this->createdByApi) {
            $this->addMessage('Nejsi přihlášený/á, nebo nemáš dostatečná oprávnění', self::MSG_ERROR);
            $this->redirect('prihlaseni');
        }
        else { //pokud byl požadavek z API, vrátíme chybový kód
            header('HTTP/1.1 401 Unauthorized');
            die('Nedostatečná oprávnění');
        }
    }
}

        $this->authUser($userManager->getUserPermission(UserManager::$user['user_name']), $articleManager->getArticlePermission(ArticleManager::$article['url']));
 
Odpovědět
21.1.2020 14:49
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:21.1.2020 21:22

Zadne var_dumpy tam nemas. Treba je mas na spatnych mistech.

Error vetsinou napise cislo radku. Tam hledej chybu, nebo radky nad tim.

public function authUser($articlePermission = array('user'), $userPersmission = array('user')) {
// nejsem si jisty, ze to takhle muzes napsat. V radku, kde predavas
// parametry nemuzes naplnovat hodnotami, jakoze do pole vkladat 'user'.
// array() by tam mel vzit a pak to doresit uz podminkou na count()
 
Nahoru Odpovědět
21.1.2020 21:22
Avatar
Martin Suchodol:21.1.2020 22:10

Nejsou tam, jen jsem s jejich pomocí zjišťoval co do funkce vlastně teče (jejich výpis je ve druhém screenu). A data tam jdou správná. Jinak kde se zhruba chyba nachází vím. Je to i ve screenu, s tím chybovím hlášením, jedná se o funkci authUser(), v administration­Controlleru(). Ale at se na to koukám jak se na to koukám tak tam chybu nevidím. Resp. s touto chybiu jsem se zatím setkal jen v případě kdy se pokusím pole vypsat pomocí echa. Proto sem to psal jsem

 
Nahoru Odpovědět
21.1.2020 22:10
Avatar
Odpovídá na Peter Mlich
Martin Suchodol:23.1.2020 10:20

ještě bych dodal že to zda jsou parametry naplněné hodnotami je zcela jedno funguje to stejným způsobem, resp. to vyhazuje stejnou chybu.

 
Nahoru Odpovědět
23.1.2020 10:20
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:23.1.2020 11:09

Asi mas naivni predstavu, ze budu vstupni data opisovat z obrazku. To asi radeji prenecham reakci na nekoho jineho? :) Navic jsem si obrazku nevsiml, takze dik za upozorneni.

<?php
$a = array(
0 => array(
        'role_name' => 'admin',
        0 => 'admin'
        ),
1 => array(
        'role_name' => 'developer',
        0 => 'developer'
        )
);

$b = array(
0 => array(
        'role_name' => 'developer',
        0 => 'developer'
        )
);

$result = (bool) array_intersect($a, $b);

var_dump($result);
?>

https://www.php.net/array_intersect
Obavam se, ze problem je prosty. Autori funkce nepocitali s rekurzi ( array(array()) ). Funkce ocekava ze hodnota pole bude string a nikoliv array.
Jeden manik v online dokumentaci zminil, ze pouzil serialize.

<?php
$a = array(
0 => array(
        'role_name' => 'admin',
        0 => 'admin'
        ),
1 => array(
        'role_name' => 'developer',
        0 => 'developer'
        )
);

$b = array(
0 => array(
        'role_name' => 'developer',
        0 => 'developer'
        )
);

foreach ($a as $key=>$value) $a[$key] = serialize($value);
foreach ($b as $key=>$value) $b[$key] = serialize($value);
var_dump($a, $b);

$result = array_intersect($a, $b);

var_dump($result, (bool) $result);
?>
Editováno 23.1.2020 11:10
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
23.1.2020 11:09
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:23.1.2020 11:18

A take je tam spousta dalsich prikladu. Neco s rekurzemi pres cykly, jine s array_values, json_encode, ....
To serialize vypada slibne. Veme array, prevede ji na string a pak uz porovnava stringy. Pokud tam nemas dalsi zaludnosti, mohlo by to splnit ucel. A pokud to nepotrebujes extra rychle.

 
Nahoru Odpovědět
23.1.2020 11:18
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:23.1.2020 11:22

Jo, a co je dulezite zminit, ze problem, chybu, vypisuje, dle obrazku funkce array_intersect. A podle chyby, tu jsi sem nezkopisoval celou, co by bylo asi lepsi, tak ta funkce ocekava jina data, nez ji posilas. Cili, co jsem psal, po zkouknuti dokumentace a prikladu jsem dosel k zaveru, ze to neumi zpracovat hodnotu typu array, pole uvnitr pole, array(array()).

 
Nahoru Odpovědět
23.1.2020 11:22
Avatar
Odpovídá na Peter Mlich
Martin Suchodol:23.1.2020 12:38

Nejspíš si mi pohl vyřešit jiný problém. To jak se mi vypisují data do print_r(), popř do var_dump(). Tedy jako rekurze jsem již zde řešil dříve odpovědím mi bylo jen naformátování dat, někde budu mit ve wampu něco špatně nastavenýho protože když jsem to co mám nahrál na RPI server. Tak se mi chyba i přes zapnuté chybové hlášení vůbec nezobrazovala. Jen mě netrklo že by to mohlo být tím že se mi data vypisují do rekurze. Což už bude chybou přímo někde v routeru nebo v kontroleru. Proto mi to celé přestalo fungovat ve chvíli kdy jsem jsem data začal tahat z databáze. Dokud jsem je tam na zkoušku dával manuálně, tedy v kódu tak to fungovalo jak mělo.

Editováno 23.1.2020 12:38
 
Nahoru Odpovědět
23.1.2020 12:38
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.