| 19 | |
| 20 | Ќе започнам со објаснување на начинот на најва и автентикација во апликацијата. За автентикација се користи Middleware кој што обезбедува механизам за проверка и филтрирање на HTTP барањата на апликацијата. Laravel вклучува софтвер кој потврдува дека корисникот е автентициран. Ако корисникот не е автентициран, ќе го пренасочи корисникот на екранот за најава. Меѓутоа, ако корисникот е автентициран, ќе дозволи барањето да продолжи да се процесира. Освен базичните класи за автентикација кои ни ги овозможува Laravel во Middleware директориумот ги додаваме сите проверки кои му дозволуваат на корисникот да се автентицира. На пример во апликацијата предуслов за најава е да се креира лозинка за да се активира профилот на корисникот. Laravel го олеснува начинот на заштитата на апликацијата од напади за не верифицирани барања меѓу страници со помош на CSRF. Laravel автоматски генерира CSRF „токен“ за секоја активна корисничка сесија управувана од апликацијата. Овој токен се користи за да се потврди дека автентицираниот корисник е тој што всушност ги поставува барањата до апликацијата. Во секоја форма преку која праќаме HTTP барање потребно е да се додаде и CSFR токенот.\\ |
| 21 | |
| 22 | {{{ |
| 23 | Route::group(['prefix' => 'auth'], function () { |
| 24 | |
| 25 | Route::get('/login', "Auth\LoginController@showLogin")->name("auth.showLogin"); |
| 26 | Route::get('/verify-login/{id}/{token}', "Auth\VerifyLoginController@index")->middleware("CheckVerifyToken")->name("verify-login.index"); |
| 27 | Route::post('/verify-login/{id}/{token}', "Auth\VerifyLoginController@verify")->name("verify-login"); |
| 28 | Route::post('/login', "Auth\LoginController@login")->name("auth.login"); |
| 29 | Route::post('/logout', "Auth\LoginController@logout")->name("auth.logout"); |
| 30 | |
| 31 | Route::get('/forgot', "Auth\ForgotPasswordController@showForgotPassword")->name("auth.forgotShow"); |
| 32 | Route::post('/forgot', "Auth\ForgotPasswordController@forgotPassword")->name("auth.forgot"); |
| 33 | |
| 34 | Route::group(['middleware' => "createPassword"], function () { |
| 35 | Route::get('/create-password/{id}/{token}', "Auth\CreatePasswordController@showCreatePassword")->name("auth.create-password-show"); |
| 36 | Route::post('/create-password/{id}/{token}', "Auth\CreatePasswordController@createPassword")->name("auth.create-password"); |
| 37 | }); |
| 38 | |
| 39 | }); |
| 40 | }}} |
| 41 | ''Листа на рути за автентикација''\\ |
| 42 | Како што може да се види за секој повик за автентикација потребен е параметарот token кој што означува уникатен идентификатор на корисничкиот профил преку кој корисникот се автентицира и праќа барања до серверот.\\ |
| 43 | |
| 44 | {{{ |
| 45 | |
| 46 | public function __construct() |
| 47 | { |
| 48 | $this->middleware("guest")->except('logout'); |
| 49 | } |
| 50 | |
| 51 | public function showLogin() |
| 52 | { |
| 53 | return view("auth.login"); |
| 54 | } |
| 55 | |
| 56 | public function login(LoginRequest $request, Hashid $hashid) |
| 57 | { |
| 58 | $user = User::whereUsername($request->username)->first(); |
| 59 | |
| 60 | if (is_null($user)) { |
| 61 | Alert::flash("Please check your credentials", "error"); |
| 62 | return redirect()->route("auth.login"); |
| 63 | } |
| 64 | |
| 65 | if (!$user->is_active) { |
| 66 | Alert::flash("Your account is blocked or its not confirmed yet. Please contact with your system administrator or check your email.", "error"); |
| 67 | return redirect()->route("auth.login"); |
| 68 | } |
| 69 | |
| 70 | if (!Hash::check($request->password, $user->password)) { |
| 71 | Alert::flash("Your password is incorrect", "error"); |
| 72 | return redirect()->route("auth.login"); |
| 73 | } |
| 74 | |
| 75 | if ($user->is_forgot_password) { |
| 76 | $user->is_forgot_password = false; |
| 77 | } |
| 78 | |
| 79 | $user->security_code = rand(10000, 99999); |
| 80 | $user->verify_token = Str::uuid(); |
| 81 | $user->is_online = true; |
| 82 | $user->save(); |
| 83 | |
| 84 | $user->notify(new VerifyUser($user)); |
| 85 | |
| 86 | return redirect()->route("verify-login.index", [ |
| 87 | "id" => $hashid->encode($user->id), |
| 88 | "token" => $user->verify_token |
| 89 | ]); |
| 90 | } |
| 91 | }}} |
| 92 | ''Методи од контролерот LoginController за најава во апликацијата''\\ |
| 93 | Со помош на методот showLogin() го прикажуваме интерфејсот за најава во апликацијата. Во методот login() се врши најавата. Во овој метод има два параметри од кои едниот е валидацијата на податоците преку барањето која се врши преку класата LoginRequest како и $hashid од класата HashId која ни помага при енкодирање на токенот за верификација на најавата. Во овој метод проверуваме дали корисникот постои во база, е активен т.е. дали креирал лозинка и се најавил во системот и дали има внесено точна лозинка. Потоа му се генеира безбедносен код кој што ќе му биде испратен на маил за верификација на најавата преку VerifyUser класата за праќање на нотификација како и токенот за верификација преку кој ќе се најави. По автентикација на корисникот ќе му се појави екранот за внес на кодот за верификација т.е. ќе се прати барање до контролерот VerifyLoginController.\\ |
| 94 | |
| 95 | {{{ |
| 96 | public function toMail($notifiable) |
| 97 | { |
| 98 | $hashId = new Hashid(); |
| 99 | |
| 100 | return (new MailMessage) |
| 101 | ->greeting("Login verification") |
| 102 | ->line("To verify click the button and enter your security code.") |
| 103 | ->line("Your security code is: " . $this->user->security_code) |
| 104 | ->action("Verify", route("verify-login.index", [ |
| 105 | "id" => $hashId->encode($this->user->id), |
| 106 | "token" => $this->user->verify_token |
| 107 | ])); |
| 108 | } |
| 109 | }}} |
| 110 | ''Метод од класата VerifyUser за праќање на верификацистиот код на маил'' |
| 111 | |
| 112 | |
| 113 | {{{ |
| 114 | public function index() |
| 115 | { |
| 116 | return view("auth.verify-login"); |
| 117 | } |
| 118 | |
| 119 | public function verify(Request $request, Hashid $hashid, $id, $token) |
| 120 | { |
| 121 | $user = User::findOrFail($hashid->decode($id)); |
| 122 | |
| 123 | if($request->code != $user->security_code) { |
| 124 | Alert::flash("Security code is wrong", "error"); |
| 125 | return redirect()->back(); |
| 126 | } |
| 127 | |
| 128 | auth()->login($user); |
| 129 | |
| 130 | return redirect()->route("dashboard.index"); |
| 131 | } |
| 132 | }}} |
| 133 | ''Методи од контролерот VerifyLoginController''\\ |
| 134 | Секогаш почнуваме со приказ на интерфејсот т.е. index методот која ни служи за таа намена. Откако корисникот ќе се најави ќе стигне барањето до методот verify кој ќе го прими барањето, ќе направи декодирање на претходно енкодираниот $hashid и ќе му дозволи на корисникот да се најави во системот.\\ |
| 135 | |
| 136 | == Управување со оддели |