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
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 le404.blade.php
.
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
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);
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);
}
});
}