Професионална програма
Loading...
stlevkov avatar stlevkov 9 Точки

Users access control - Blog system using PhP MySQL

Здравейте,

Предварително се извинявам ако е засегнат въпроса в друга тема , не можах да го открия.

Проблема в момента е че когато един User редактира съдържанието на поста си , то бъде извиквано с функция getPostByID(), която прави заявка към базата и взима всички данни от нея само за този  User, но проверката на формата проверява , какво e изписано в полето за адреси:           edit picture problem . Проблемът тук е че проверката следи дали има такъв пост изобщо, а не дали е в притежание на логнатия в момента user.

Ако в това поле изпиша друго ID , което съответства на друг потребителски пост , то ми дава да го редактирам независимо с какъв user съм логнат.

function getPostById(int $id)
    {
        $statement = self::$db->prepare(
            "SELECT posts.id, title, content, date, full_name, user_id " .
            "FROM posts LEFT JOIN users on posts.user_id = users.id " .
            "WHERE posts.id = ?");
        $statement->bind_param("i", $id);
        $statement->execute();
        $result = $statement->get_result()->fetch_assoc();
        return $result;
    }

Това ми е функцията, с която взимам постовете по ID , за да бъдат редактирани. Как мога да огранича взимането само на User-а , който иска да редактира конкретно неговите постове.

Проверката , която проверява дали има изобщо ID в таблицата :
 

 $post = $this->model->getPostById($id);
            if (!$post) {
                $this->addErrorMessage("Error: post does not exist");
                $this->redirect("posts");
            }
            $this->post = $post;
        }

Същото се отнася и за User-ите , които съм написал аналогично на постовете. Всеки User може да редактира данните на друг User. Сякаш всеки user сам по себе си е администратор и има пълни права.
Тествах метод с който добавих поле към таблицата на всеки user -> Acess (0, 1) , ако е 1 може да го прави , ако е 0 не може. Но така ограничавам само 1 потребител (Admin) да извършва тези действия и user-ите не могат да редактират техните си данни.
 Ще съм благодарен на съвет , как да го направя. 


Също така , тук в този форум , ако напишем ръчно друго ID < горе в полето , където този пост в момента има ID - 11524, то системата на СофтУни също позволява аз да виждам редактиращата форма на постовете на други колеги, но не мога да ги редактирам? Би трябвало да не ме допуска до линка.

 

Благодаря предварително.

 

Тагове:
1
Fundamentals Module 04/09/2016 11:50:36
stlevkov avatar stlevkov 9 Точки

Трябваше да минат 2 дни в мислене , да стигна до публикуване на проблема в форума и чак тогава да ми светне лампата и с просто решение да забраня цялото действие:

Вместо да правя нови access колони в таблицата и да ограничавам действията от контролера - без успех, добавих проверка в формата , която позволява "виждането" на самата форма само за логнатия потребител.

Ако няма else { } , позволява да се вижда формата от други потребители , но скрива бутоните edit и cancel. 

<?php
   if ($this->post['user_id'] == htmlspecialchars($_SESSION['user_id'])) {
     echo " <div><input type=\"submit\" value=\"Edit\"></div>";
   } else {
     $this->redirect('myposts');
   }?>
<div class="cancel-button">
   <a href="<?=APP_ROOT?>/myposts">Cancel</a></div>

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

Дано да съм помогнал и на други колеги , имащи подобен проблем. Много се радвам че открих иглата в сеното.
Поздрави :)

1
04/09/2016 14:33:34