web-dev-qa-db-fra.com

Laravel 5.3 politiques comment rediriger les utilisateurs non autorisés

Je ne le trouve pas sur la documentation. Comment rediriger un utilisateur non autorisé?

RolePolicy.php

class RolePolicy
{
    use HandlesAuthorization;

    public function manageRoles(User $user)
    {
        return $user->isAdmin();
    }
}

RolesController.php

function __construct()
{
    $this->authorize('manageRoles', Role::class);
}

Merci d'avance

11
Kris MP

Vous pouvez modifier le fichier app\Exceptions\Handler.php

sur la fonction de rendu:

public function render($request, Exception $e)
{

    /**modified part**/  
    if ($request->wantsJson()) {
        return response([
            'success' => false,
            'message' => $e->getMessage()
        ], 404);
    }

    if ($e instanceof AuthorizationException) {
        return redirect('path');

        //or simply
        return view('errors.forbidden');
        //but this will return an OK, 200 response.
    }
    /**end of modified part**/

    return parent::render($request, $e);
}

Si vous voulez mettre un 403, utilisez la fonction d'assistance response(). Vous pouvez voir la documentation des réponses ici https://laravel.com/docs/master/responses

Fondamentalement, vous pouvez utiliser la solution pour jouer avec plus d'options. Mais le moyen le plus simple consiste simplement à créer un fichier de vue: errors/403.blade.php Et cette vue se chargera automatiquement lorsque vous rencontrerez des exceptions non autorisées. La même chose fonctionnera pour 404 introuvable, il suffit de créer le 404.blade.php.

8
Muhammad Maulana

Pour autant que je sache, ce n'est pas différent dans Laravel 5.3 comme dans n'importe quelle version de Laravel 5.

Il existe un middleware de route nommé auth qui fait référence à App\Http\Middleware\Authenticate (défini dans app/http/Kernel.php)

Dans cette classe:

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->guest()) {
        if ($request->ajax()) {
            return response('Unauthorized.', 401);
        } else {
            return redirect()->guest('login');
        }
    }

    return $next($request);
}

Ce middleware auth peut être appliqué aux routes qui nécessitent une authentification.

En savoir plus sur le middleware ici: https://laravel.com/docs/5.3/middleware

En savoir plus sur l'authentification ici: https://laravel.com/docs/5.3/authentication

3
Devon

Utilisez Laravel Gates, dans vos méthodes de contrôleur. Par exemple:

public function update(Role $role){

if(\Gates::allows('manageRoles',$role)) {

return redirect()->back()->with('status','Success');

}

Cependant, je pense personnellement que c'est trop gênant de définir une page de redirection pour chaque action du contrôleur. Si l'action est refusée car l'utilisateur a manipulé l'URL et non parce que certaines conditions préalables n'ont pas été remplies, une page 404 droite avec un bouton d'accueil devrait suffire.

Comme ce que dit la réponse ci-dessus, il est beaucoup mieux et plus facile d'utiliser simplement les réponses Laravel, appelez la page d'erreur que vous voulez et passez un message personnalisé.

comme cette réponse d'un autre fil:

return response("User can't perform this action.", 401);

https://stackoverflow.com/a/38611737/61310

0
Bruce Tong

J'ai implémenté une logique, j'aimerais que cela aide quelqu'un.
Tout d'abord, appelez la méthode par exemple $this->anonymouslyAuthorize($model)
dans une méthode de votre PostController par exemple

public function show(Post $post)
{
    $this->anonymouslyAuthorize($post);

    // The user is authorized.
}

dans votre contrôleur de base qui reste dans le répertoire des contrôleurs, ajoutez cette méthode.

public function anonymouslyAuthorize($model)
{
    Auth::user()->can('see', $model);
}

dans AuthServiceProvider dans la méthode de démarrage, définissez cette porte.

public function boot()
{
    $this->registerPolicies();

    Gate::define('see', function ($user, $model) {
        if ($user->id !== $model->user_id) {
            abort(404);
        }
    });
}
0
Mustafa Omar