Middleware do autoryzacji w szablonie blade

0

Bry.

Laravel 8 to wersja mojego FrameWorka

Stworzyłem middleware, by autoryzować userów. Ale chyba źle go napisałem. Domyślnie chciałbym, że gdy formularz logowania zostanie prawidłowo wypełniony, móc używać klauzuli @auth w szablonie blade. Jednak rozpoznaje mnie ciągle jako gość, nawet jak wpiszę poprawne dane.

Logowanie opiera się na stworzeniu zmiennej sesyjnej, i ustawieniu jej na odpowiednią wartość, jaka jest przypisana do sukcesu - poprawnych danych logowania.

Mój middleware wygląda tak:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class Weryfikacja
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        if ($request->session()->get('zalogowany', 'nie') == 'nie')
            return redirect()->route('login');
        
        return $next($request);
    }
}

To mój pierwszy MiddleWare więc pewnie coś poknociłem. Proszę o wskazówki. Middleware podpiąłem w Kernel.php:

...
'check' => \App\Http\Middleware\Weryfikacja::class,
...

Następnie dopisałem do definicji ścieżki:

Route::get('/adm', 'App\Http\Controllers\AdminPanelController@mainMethod')->name('pa')->middleware('check');

Co robię źle? :(

Dzięki
M.

PS. mainMethod wygląda tak:

public function mainMethod(Request $request)
{
    return view('glowna');
}

PS2. dane logowania sprawdzam tak:

Route::post('/adm/check', 'App\Http\Controllers\AdminPanelController@check')->name('sprawdz');
public function check(Request $request)
{
    $usr = $request->post('login');
    $pss = hash('sha256', $request->post('haslo'));

    $haslo = Uzytkownik::query()->where('uzy_email', $usr)->value('uzy_haslo');

    if (!is_null($haslo) && strcmp($pss, $haslo) == 0)
        $request->session()->put('zalogowany', 'tak');

    return redirect()->route('pa');
}

PS3. Dane z bazy czytane są dobrze po robiłem testy dd($pss, $haslo); i zgadzały się wartości

3

Troszkę chaotycznie opisałeś no i ja już jakiś czas nie pisałem w Laravelu, ale dyrektywa @auth odnosi się do wbudowanego systemu logowania. Wtedy w midlleware możesz użyć Auth::login() celem zalogowania użytkownika przez własne metody do logowania. To co wkleiles wydaje się zbliżoną metodą logowania to dej dostępnej w standardzie.
Wyjaśnij może co chcesz osiągnąć nie używając standardowej metody logowania, a próbując używać dyrektywy blade od niej.

0

Słyszałem, że można podpiąć middleware pod dowolną ścieżkę i odblokować użycie @auth w widoku. Jednak koledze coś wypadło i nie mogę z nim pogadać odnośnie szczegółów.

Natomiast wbudowany system logowania też jest napisany przy pomocy części składowych. Więc na logikę można jakoś samemu zrobić to samo. Tylko nie wiem jak :/

2

No możesz logować użytkownika swoją metodą przy zużyciu fasady Auth i wtedy masz wszystko działające. W swoim midlware po prostu logujesz użytkownika przez Auth::login
Jeśli oczywiście chcesz mieć swoją metodę logowania wykorzystująca podstawowe funcjonalnosci tej wybudowanej.
Ja robiłem kiedyś tak właśnie jak mieliśmy własne SSO w firmie z podziałem na role.

0

W szablonie @auth uzywasz od samego poczatku i nie ma tu znaczenia zaden middleware. To zwyczajna fasada
'Auth' => Illuminate\Support\Facades\Auth::class,

w widoku dajesz

 @auth
     pokaz to jesli user zalogowany
 @endauth

albo

 @guest
       pokaz tutj jesli user niezalogowany
 @endguest

A jesli chcesz dac dostepy do danych kontrolerow dla zalogowanych uzytkownikow to w route/web.php

Route::group(['middleware' => ['auth']], function () {
 
     Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
 
     // Calendar
     Route::group(['prefix' => 'calendar'], function () {
         Route::get('/', [CalendarController::class, 'index'])-name('calendar.index');
         Route::get('/termin', [CalendarController::class, 'termin'])->name('calendar.termin');
     });
});

i teraz po wpisaniu adresu strona/dashboard ma dostep tylko zalogowany user lub do grupy calendar twojastrona/calendar/termin

0

Dzięki. Już sobie poradziłem

Dodałem do klasy mojego modelu użytkownika dziedziczenie po klasie wbudowanego Usera Następnie w moim middleware, po ustaleniu że dane logowania są poprawne, dałem:

$usr = new Uzytkownik([
    'usr_name'      => $request->session()->get('imie', 'Imię'),
    'usr_sname'     => $request->session()->get('nazwisko', 'Nazwisko')
]);
Auth::login($usr);
return $next($request);

Teraz działa @auth i mogę nawet czytać pola załadowanego usera:
{{ auth()->user()->usr_name }} etc. Dzięki!

3

No to tylko z tym defaultem dla metody get uważaj, bo przecież możesz mieć użytkownika o imieniu Imię i nazwisku Nazwisko

1 użytkowników online, w tym zalogowanych: 0, gości: 1