Advertisement
deyanivanov966

Упражнение Автентикация. 10.12.2021 (инструкции)

Feb 21st, 2022
668
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 7.77 KB | None | 0 0
  1. Стъпка 0. Подготовка
  2.  
  3. Използваме подход “Learning by Doing”.
  4.  
  5.  
  6. Архивираме проекта с цел да възстановим данните, ако се наложи.
  7.  
  8.  
  9. Стартираме Apache & MySQL & cmd
  10.  
  11. Ако XAMPP е инсталиран на D:, то първо сменяме устройството, а после директорията:
  12.  
  13. D:
  14.  
  15. cd \xampp\htdocs\laravel8
  16.  
  17. PATH=%PATH%;C:\xampp\php
  18.  
  19. PATH=%PATH%;D:\xampp\php
  20.  
  21.  
  22.  
  23. Стъпка 1. Инсталираме Laravel Breeze
  24.  
  25. Следваме ръководството:
  26.  
  27. https://laravel.com/docs/8.x/starter-kits#laravel-breeze
  28.  
  29. НО работим творчески и използваме проекта от предходното упражнение!
  30.  
  31.  
  32. composer require laravel/breeze --dev
  33.  
  34. или
  35.  
  36. php \xampp\composer.phar require laravel/breeze --dev
  37.  
  38.  
  39. Изпълняваме:
  40.  
  41. php artisan breeze:install
  42.  
  43.  
  44. Инсталираме Node.js преносимо.
  45.  
  46. https://nodejs.org/en/download/
  47.  
  48. https://nodejs.org/dist/v16.13.1/node-v16.13.1-win-x64.zip
  49.  
  50. Разархивираме в \xampp\node
  51.  
  52. PATH=%PATH%;C:\xampp\node
  53.  
  54.  
  55. npm install
  56.  
  57. npm run dev
  58.  
  59.  
  60.  
  61. Стъпка 2. Работим по Model-а - admin middleware
  62.  
  63. Отваряме
  64.  
  65. \xampp\htdocs\laravel8\database\migrations\2014_10_12_000000_create_users_table.php
  66.  
  67. Добавяме код, който добавя ново поле в таблицата от БД - дали потребителя има администраторски права, т.е. възможност да редактира и изтрива записи:
  68.  
  69.     public function up()
  70.  
  71.     {
  72.  
  73.         Schema::create('users', function (Blueprint $table) {
  74.  
  75.             $table->id();
  76.  
  77.             $table->boolean('isAdmin')->nullable();
  78.  
  79.             $table->string('name');
  80.  
  81.             $table->string('email')->unique();
  82.  
  83.             $table->timestamp('email_verified_at')->nullable();
  84.  
  85.             $table->string('password');
  86.  
  87.             $table->rememberToken();
  88.  
  89.             $table->timestamps();
  90.  
  91.         });
  92.  
  93.     }
  94.  
  95. Чрез phpMyAdmin ръчно ще се задава кои потребители имат администраторски права.
  96.  
  97.  
  98.  
  99. Стъпка 3. Стартираме миграция
  100.  
  101. php artisan migrate:refresh
  102.  
  103. В резултат се изтриват и създават отново всички таблици.
  104.  
  105.  
  106.  
  107. Стъпка 4. Работим по маршрутизацията - защитаваме достъпа до games
  108.  
  109. Към момента е защитен достъпа само до dashboard. Ще защитим достъпа и до games.
  110.  
  111. Отваряме:
  112.  
  113. \xampp\htdocs\laravel8\routes\web.php
  114.  
  115.  
  116. В стария файл web.php имаше:
  117.  
  118. Route::resource('games', 'GameController');
  119.  
  120. , но понеже целия файл беше презаписан от инсталацията на Laravel Breeze, то този ред сега го няма.
  121.  
  122.  
  123. Добавяме в края на файла:
  124.  
  125. Route::resource('games', 'GameController')->middleware('auth');
  126.  
  127.  
  128. Стъпка 5. Работим по View-то
  129.  
  130. Добавяне на бутон за изход.
  131.  
  132. Отваряме файл:
  133.  
  134. \xampp\htdocs\laravel8\resources\views\index.blade.php
  135.  
  136. Добавяме:
  137.  
  138. <a href="{{ route('games.create')}}" class="btn btn-success">ADD</a>
  139.  
  140. <div class="float-right">
  141.  
  142.   {{ Auth::user()->name }}
  143.  
  144.   <a href="{{ route('logout') }}" class="btn btn-dark" onclick="event.preventDefault(); document.getElementById('logout-form').submit();">
  145.  
  146.     {{ __('Logout') }}
  147.  
  148.   </a>
  149.  
  150.   <form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
  151.  
  152.     @csrf
  153.  
  154.   </form>
  155.  
  156. </div>
  157.  
  158.  
  159. Проверка:
  160.  
  161. http://127.0.0.1/laravel8/public/games
  162.  
  163. Достъп до games трябва да имат само регистрирани и логнати потребители.
  164.  
  165.  
  166. Обикновеният потребител ще може само да добавя нови записи, а този с администраторски права и да редактира и изтрива.
  167.  
  168. Регистрираме 2-ма отделни потребители. На единия чрез phpMyAdmin задаваме на isAdmin стойност 1.
  169.  
  170. http://127.0.0.1/phpmyadmin/sql.php?db=laravel&table=users
  171.  
  172.  
  173. Отваряме:
  174.  
  175. \xampp\htdocs\laravel8\resources\views\index.blade.php
  176.  
  177.  
  178. Променяме:
  179.  
  180. <td><a href="{{ route('games.edit', $game->id)}}" class="btn btn-primary">Edit</a></td>
  181.  
  182. Обграждаме показването на бутона за редактиране в условен израз:
  183.  
  184. <td>
  185.  
  186.    @if(Auth::user()->isAdmin==1)
  187.  
  188.       <a href="{{ route('games.edit', $game->id)}}" class="btn btn-primary">Edit</a>
  189.  
  190.    @endif
  191.  
  192. </td>
  193.  
  194.  
  195. Променяме:
  196.  
  197. <td>
  198.  
  199.    <form action="{{ route('games.destroy', $game->id)}}" method="post">
  200.  
  201.       @csrf
  202.  
  203.       @method('DELETE')
  204.  
  205.        <button class="btn btn-danger" type="submit">Delete</button>
  206.  
  207.    </form>
  208.  
  209. </td>
  210.  
  211. Обграждаме показването на бутона за изтриване в условен израз:
  212.  
  213. <td>
  214.  
  215.    @if(Auth::user()->isAdmin==1)
  216.  
  217.    <form action="{{ route('games.destroy', $game->id)}}" method="post">
  218.  
  219.       @csrf
  220.  
  221.       @method('DELETE')
  222.  
  223.        <button class="btn btn-danger" type="submit">Delete</button>
  224.  
  225.    </form>
  226.  
  227.    @endif
  228.  
  229. </td>
  230.  
  231.  
  232. Добавяне показване на съобщения за грешки в червен цвят:
  233.  
  234. <div class="uper">
  235.  
  236.   @if(session()->get('success'))
  237.  
  238.     <div class="alert alert-success">
  239.  
  240.       {{ session()->get('success') }}
  241.  
  242.     </div><br />
  243.  
  244.   @endif
  245.  
  246.   @if(session()->get('error'))
  247.  
  248.     <div class="alert alert-danger">
  249.  
  250.       {{ session()->get('error') }}
  251.  
  252.     </div><br />
  253.  
  254.   @endif
  255.  
  256.   <a href="{{ route('games.create')}}" class="btn btn-success">ADD</a>
  257.  
  258.  
  259. Стъпка 6. Работим по Controller-а
  260.  
  261. Проверяваме дали единият потребител може само да добавя, а другият и да редактира и да изтрива.
  262.  
  263. http://127.0.0.1/laravel8/public/games
  264.  
  265.  
  266.  
  267. Към момента само е скрито показването на бутоните за редактиране и изтриване. Необходимо е и поставянето на проверки в кода на контролера, за да няма възможност за пробив в сигурността.
  268.  
  269. Отваряме:
  270.  
  271. \xampp\htdocs\laravel8\app\Http\Controllers\GameController.php
  272.  
  273. Добавяме:
  274.  
  275.     public function edit($id)
  276.  
  277.     {
  278.  
  279.         if(auth()->user()->isAdmin != 1)
  280.  
  281.            return redirect('/games')->with('error', 'You are not admin!');        
  282.  
  283.         $game = Game::findOrFail($id);
  284.  
  285.         return view('edit', compact('game'));
  286.  
  287.     }
  288.  
  289.  
  290.     public function update(Request $request, $id)
  291.  
  292.     {
  293.  
  294.         if(auth()->user()->isAdmin != 1)
  295.  
  296.             return redirect('/games')->with('error', 'You are not admin!');                
  297.  
  298.         $validatedData = $request->validate([
  299.  
  300.             'name' => 'required|max:255',
  301.  
  302.             'price' => 'required',
  303.  
  304.         ]);
  305.  
  306.         Game::whereId($id)->update($validatedData);
  307.  
  308.         return redirect('/games')->with('success', 'Game is successfully updated');
  309.  
  310.     }
  311.  
  312.  
  313.     public function destroy($id)
  314.  
  315.     {
  316.  
  317.         if(auth()->user()->isAdmin != 1)
  318.  
  319.            return redirect('/games')->with('error', 'You are not admin!');
  320.  
  321.         $game = Game::findOrFail($id);
  322.  
  323.         $game->delete();
  324.  
  325.         return redirect('/games')->with('success', 'Game is successfully deleted');
  326.  
  327.     }
  328.  
  329.  
  330.  
  331.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement