Changes between Version 13 and Version 14 of Имплементација


Ignore:
Timestamp:
11/21/21 15:25:18 (3 years ago)
Author:
151545
Comment:

Legend:

Unmodified
Added
Removed
Modified
  • Имплементација

    v13 v14  
    1010
    1111=== - Имплементациски дијаграм ===
     12
     13
     14== Најава и автентикација
    1215
    1316Во овој дел ќе бидат прествени и објаснати одредени функционалности од системот кои се користат нај често во рамки на системот. Ќе започнам со објаснување за начинот на креирање на оддел кој што е предуслов за креирање на фолдер т.е. документ.\\
    1417Во MVC системот моделот е класа која се состои од податоци запишани во одредена табела во база. View го претставува интерфејсот преку кој корисникот комуницира со апликацијата. Кога корисникот презема акција, Controller се справува со акцијата и ги ажурира податоците во база преку моделот доколку е потребно.\\
    1518Во Laravel, моделот обично е класа со променливи што одговараат на колоните во базата на податоци т.е. променливите кои се дефинирани во Migrations во одредена табела. Контролерите се одговорни за завршување на корисничките дејства и за управување со деловната логика на апликацијата. Рутирањето на ресурсите во Laravel ги доделува „CRUD“ операциите или функциите дефинирани во контролерот со една линија код.\\
     19
     20Ќе започнам со објаснување на начинот на најва и автентикација во апликацијата. За автентикација се користи Middleware кој што обезбедува механизам за проверка и филтрирање на HTTP барањата на апликацијата. Laravel вклучува софтвер кој потврдува дека корисникот е автентициран. Ако корисникот не е автентициран, ќе го пренасочи корисникот на екранот за најава. Меѓутоа, ако корисникот е автентициран, ќе дозволи барањето да продолжи да се процесира. Освен базичните класи за автентикација кои ни ги овозможува Laravel во Middleware директориумот ги додаваме сите проверки кои му дозволуваат на корисникот да се автентицира. На пример во апликацијата предуслов за најава е да се креира лозинка за да се активира профилот на корисникот. Laravel го олеснува начинот на заштитата на апликацијата од напади за не верифицирани барања меѓу страници со помош на CSRF. Laravel автоматски генерира CSRF „токен“ за секоја активна корисничка сесија управувана од апликацијата. Овој токен се користи за да се потврди дека автентицираниот корисник е тој што всушност ги поставува барањата до апликацијата. Во секоја форма преку која праќаме HTTP барање потребно е да се додаде и CSFR токенот.\\
     21
     22{{{
     23Route::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{{{
     96public 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== Управување со оддели
    16137
    17138{{{
     
    250371За потребите на компанијата додаден е метод за симнување на сите фолдери со нивните датотеки од еден оддел преку кој се креира zip кој ги содржи сите фолдери од еден оддел со истата структура како што се тие запишани на сервер. На почеток проверуваме дали има празни фолдери со цел тие да ги игнорираме затоа што не содржат ниту една датотека.Класата RecursiveIteratorIterator која што е тип на итератор кој ни овозможува рекурзивно да ги поминеме сите патеки ми помогна да ги најдам потребните фолдери и датотеки. За разлика од обичен итератор кој што пребарува низ листа RecursiveIteratorIterator може да се каже дека пребарува низ дрво и ја олеснува работата кога се работи за неколку патеки во еден директориум. За секоја пронајдена датотека ја добиваме патеката од Storage и ја додаваме во zip. На крај ја симнуваме датотеката со доделено име, прикажуваме соодветна порака и се враќаме назад. Во овој дел клуч е патеката која ја запишувам при креирање на оддел. На истиот начин направив и функција за симнување на сите оддели со нивните фолдери и датотеки при што се игнорираат празните оддели и фолдери.\\
    251372
     373
     374
     375== Уредување на кориснички податоци
     376
    252377{{{
    253378