[Laravel] Authorize middleware stuurt gasten naar loginpage

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • +1 Henk 'm!

  • ikvanwinsum
  • Registratie: Februari 2011
  • Laatst online: 14:36
Dag allen,

Bij een applicatie die ik aan het ontwikkelen ben zijn er resources waar je dynamisch de zichtbaarheid in kan stellen. Een voorbeeld van zo'n route:
PHP:
1
    Route::get('{forum}','Forum\ForumController@show')->middleware('can:view,forum');


Voor het checken van de rechten gebruik ik de Authorize middleware van Laravel. Nu wil het dat sommige van deze resources ook zichtbaar zijn voor gasten (dus niet-ingelogde gebruikers), en sommige resources zijn alleen zichtbaar voor bepaalde ingelogde gebruikers.

Onderstaand stukje uit De Authorize middleware is relevant:
PHP:
1
2
3
4
5
6
7
8
public function handle($request, Closure $next, $ability, ...$models)
    {
        $this->auth->authenticate();

        $this->gate->authorize($ability, $this->getGateArguments($request, $models));

        return $next($request);
    }


Waarbij regel 3 de volgende functie is uit Illuminate\Auth\GuardHelpers:
PHP:
1
2
3
4
5
6
7
8
public function authenticate()
    {
        if (! is_null($user = $this->user())) {
            return $user;
        }

        throw new AuthenticationException;
    }


Wat blijkt nu dus? Het gebruiken van middleware('can:iets') betekent automatisch dat een gebruiker ingelogd moet zijn.

Dat is dus precies wat ik niet wil. Hoe hebben jullie dit probleem opgelost? (Of wat zou een betere aanpak zijn)

U zegt: ‘Alles is toegestaan.’ Zeker, maar niet alles is goed. Alles is toegestaan, maar niet alles is opbouwend.

Alle reacties


Acties:
  • +1 Henk 'm!

  • Hiroj
  • Registratie: Mei 2010
  • Laatst online: 04-09 14:23
Het is voor mij niet duidelijk je onderstaande regel binnen een group hebt staan of dat {forum} gewoon een wildcard is op alle adressen.

code:
1
Route::get('{forum}','Forum\ForumController@show')->middleware('can:view,forum');


Als het een wildcard is op alle adressen, dan vind ik het niet zo gek dat hij verwacht dat een gebruiker altijd ingelogd moet zijn :P In zo'n scenario zal je in je logica moeten controleren of een gebruiker wel of geen toestemming heeft om de pagina te bekijken.

Acties:
  • +1 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 14:37

TheNephilim

Wtfuzzle

Er zijn al meerdere discussies/PR's/etc. over policies in combinatie met guest users.

- https://github.com/laravel/framework/pull/16239
- https://github.com/laravel/framework/pull/20660
- https://github.com/laravel/ideas/issues/1222

Die laatste bevat hints over hoe je het zou kunnen oplossen. Een nieuwe anonieme User instance passen kan (Gate::forUser(Auth::user() ?? new User)->allows('view', $picture);), maar dat heeft wel weer gevolgen voor andere zaken.

Acties:
  • 0 Henk 'm!

  • ikvanwinsum
  • Registratie: Februari 2011
  • Laatst online: 14:36
Hiroj schreef op dinsdag 3 juli 2018 @ 07:45:
Het is voor mij niet duidelijk je onderstaande regel binnen een group hebt staan of dat {forum} gewoon een wildcard is op alle adressen.

code:
1
Route::get('{forum}','Forum\ForumController@show')->middleware('can:view,forum');


Als het een wildcard is op alle adressen, dan vind ik het niet zo gek dat hij verwacht dat een gebruiker altijd ingelogd moet zijn :P In zo'n scenario zal je in je logica moeten controleren of een gebruiker wel of geen toestemming heeft om de pagina te bekijken.
Dat doet niks af aan mijn probleem. Ik heb resources, en of die nu op {forum} of op forums/{forum} staat zou niet uit moeten maken.

Stel dat er drie forums zijn met elk een andere zichtbaarheid Forum 1 (forums/1) is zichtbaar voor iedereen (dus ook als je niet ingelogd bent), Forum 2 (forums/2) is zichtbaar wanneer je bent ingelogd en Forum 3 (forums/3) is alleen zichtbaar voor moderators.

Het meest logische zou zijn om met de Authorize-middleware te controleren of je ingelogd bent, maar laat dat bij niet-ingelogde gebruikers nu niet werken :).
TheNephilim schreef op dinsdag 3 juli 2018 @ 09:52:
Er zijn al meerdere discussies/PR's/etc. over policies in combinatie met guest users.

- https://github.com/laravel/framework/pull/16239
- https://github.com/laravel/framework/pull/20660
- https://github.com/laravel/ideas/issues/1222

Die laatste bevat hints over hoe je het zou kunnen oplossen. Een nieuwe anonieme User instance passen kan (Gate::forUser(Auth::user() ?? new User)->allows('view', $picture);), maar dat heeft wel weer gevolgen voor andere zaken.
Dank voor de info. Blijkbaar hebben meer mensen hetzelfde probleem.

Ik heb intussen nog een paar 'oplossingen' weten te vinden:
https://stackoverflow.com...el-authorization-policies
https://gitlab.com/agilesdesign/pseudo

Ik denk dat ik maar voor de eerstetweede oplossing ga, die lijkt me het meest 'clean'.

U zegt: ‘Alles is toegestaan.’ Zeker, maar niet alles is goed. Alles is toegestaan, maar niet alles is opbouwend.


Acties:
  • +1 Henk 'm!

  • ikvanwinsum
  • Registratie: Februari 2011
  • Laatst online: 14:36
Voor wie dit later nog eens terugleest:
Inmiddels is een PR gemerged die dit probleem gaat oplossen. Nog even wachten op Laravel 5.7 dus!

https://github.com/laravel/framework/pull/24576

U zegt: ‘Alles is toegestaan.’ Zeker, maar niet alles is goed. Alles is toegestaan, maar niet alles is opbouwend.