如何使用 authorize 用户未通过授权如何友好提示?

使用 id 为 1 的用户登录,当访问 id 为 2 的用户编辑页面 —— http://sample.test/users/2/edit ,系统将会拒绝访问。

违法操作不能这样提示吧,是不是太不友好了,如何友好提示?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
幽弥狂
最佳答案
        try {
            $this->authorize ('update', $user);
            return view ('users.edit', compact ('user'));
        } catch (\Exception $exception) {
            abort(403, $exception->getMessage());
        }

然后创建 view/errors/403.blade.php

具体的内容自己创建 错误内容为 $e->getMessage()

{{ $exception->getMessage() ? $exception->getMessage(): "具体的错误提示自己定义" }}

6年前 评论
讨论数量: 16

正常用户不会发起这样的请求,这样的请求可以被认为是蓄意攻击服务器。对待攻击者不需要友好。

6年前 评论

我来总结一下上面的回答并且给出我认为的最优解

@Chasers9527 错误码需要使用 403 而不是 500
@Chasers9527 注意不要直接 catch \Exception 而是选用更小影响的 AuthorizationException
@Chasers9527 视图中获取错误信息的变量是 $exception 而不是 $e
@hustnzj 省事不等于友好,而且如果是直接输入的网址的话「返回原页面」会出问题

app/Http/Controllers/UsersController

use Illuminate\Auth\Access\AuthorizationException;
.
.
.
public function edit(User $user)
{
    try {
        $this->authorize('update', $user);
    } catch (AuthorizationException $e) {
        return abort(403, '无权访问');
    }

    return view('users.edit', compact('user'));
}
public function update(User $user, Request $request)
{
    try {
        $this->authorize('update', $user);
    } catch (AuthorizationException $e) {
        return abort(403, '无权访问');
    }

    .
    .
    .
}

然后创建 resources/views/errors/403.blade.php

resources/views/errors/403.blade.php

@extends('layouts.default')
@section('title', '403 错误')

@section('content')
    <div class="jumbotron">
        <h1>403 错误</h1>
        <p class="lead">
            {{ $exception->getMessage() ? $exception->getMessage(): "禁止访问 Permission Denied" }}
        </p>
        <p>
            <a class="btn btn-lg btn-success" href="{{ route('home') }}" role="button">返回首页</a>
        </p>
    </div>
@stop
5年前 评论
幽弥狂
        try {
            $this->authorize ('update', $user);
            return view ('users.edit', compact ('user'));
        } catch (\Exception $exception) {
            abort(403, $exception->getMessage());
        }

然后创建 view/errors/403.blade.php

具体的内容自己创建 错误内容为 $e->getMessage()

{{ $exception->getMessage() ? $exception->getMessage(): "具体的错误提示自己定义" }}

6年前 评论

你们理解错楼主的意图了,他的意思应该是这样-----像这样的「攻击性请求」,我们如何抛出点脏话给访问者,只显示出错页面,才是太友好了。

6年前 评论

正常用户不会发起这样的请求,这样的请求可以被认为是蓄意攻击服务器。对待攻击者不需要友好。

6年前 评论

你们理解错楼主的意图了,他的意思应该是这样-----像这样的「攻击性请求」,我们如何抛出点脏话给访问者,只显示出错页面,才是太友好了。

6年前 评论
幽弥狂
        try {
            $this->authorize ('update', $user);
            return view ('users.edit', compact ('user'));
        } catch (\Exception $exception) {
            abort(403, $exception->getMessage());
        }

然后创建 view/errors/403.blade.php

具体的内容自己创建 错误内容为 $e->getMessage()

{{ $exception->getMessage() ? $exception->getMessage(): "具体的错误提示自己定义" }}

6年前 评论
        try {
            $this->authorize('update', $user);
        } catch (AuthorizationException $e) {
            return redirect()->back();
        }

直接返回原页面吧,省事!

5年前 评论
        try {
            $this->authorize('upda', $user);
        } catch (AuthorizationException $authorizationException) {
            return abort(403, '对不起,你无权访问此页面!');
        }
5年前 评论
最后两个答案似乎还需要在App\Http\Controllers\UsersController中加入use Illuminate\Auth\Access\AuthorizationException;,否则catch不到相应类型的exception,最终达不到友好回应(恶毒反击)尝试突破权限的行为。
5年前 评论
bing8u

resources/views/errors/错误码.blade.php

你只需要定义此文件。

5年前 评论

我来总结一下上面的回答并且给出我认为的最优解

@Chasers9527 错误码需要使用 403 而不是 500
@Chasers9527 注意不要直接 catch \Exception 而是选用更小影响的 AuthorizationException
@Chasers9527 视图中获取错误信息的变量是 $exception 而不是 $e
@hustnzj 省事不等于友好,而且如果是直接输入的网址的话「返回原页面」会出问题

app/Http/Controllers/UsersController

use Illuminate\Auth\Access\AuthorizationException;
.
.
.
public function edit(User $user)
{
    try {
        $this->authorize('update', $user);
    } catch (AuthorizationException $e) {
        return abort(403, '无权访问');
    }

    return view('users.edit', compact('user'));
}
public function update(User $user, Request $request)
{
    try {
        $this->authorize('update', $user);
    } catch (AuthorizationException $e) {
        return abort(403, '无权访问');
    }

    .
    .
    .
}

然后创建 resources/views/errors/403.blade.php

resources/views/errors/403.blade.php

@extends('layouts.default')
@section('title', '403 错误')

@section('content')
    <div class="jumbotron">
        <h1>403 错误</h1>
        <p class="lead">
            {{ $exception->getMessage() ? $exception->getMessage(): "禁止访问 Permission Denied" }}
        </p>
        <p>
            <a class="btn btn-lg btn-success" href="{{ route('home') }}" role="button">返回首页</a>
        </p>
    </div>
@stop
5年前 评论

@Chasers9527 blade 文件内只能使用 $exception 不能使用 $e;我之前的表述有误,应该是「模板文件」而非「视图文件」

5年前 评论

@Chasers9527 是这样的,在我的理解中 At 功能既表示提及又表示引用。在我的回答中习惯性使用 At 功能来表示「这句话和某某有关」,对于后人阅读(回看提及内容)极为方便。至于通知,我认为一个回复中 At 一次和多次对于他人的「骚扰」程度是一样的,因为即使产生了多条通知对于人类来说也是可以在极短时间内处理完毕的,所以我认为我的 At 用法不但不是滥用而且是正确的用法。

请问为什么多条 At 信息会使你反感呢?即使是三条,在通知列表内应该也可以一次性看到并且判断出「这些是一样的内容无需逐个处理」吧。

5年前 评论
幽弥狂

@singee 话不投机半句多 拜拜

5年前 评论

@singee #个人自查# resources/views/errors/403.blade.php 文件中

{{ $exception->getMessage() ? $exception->getMessage(): "禁止访问 Permission Denied" }}

可以且应当简写为

{{ $exception->getMessage() ?: "禁止访问 Permission Denied" }}
5年前 评论

@singee 使用 $e 可以正常输出

5年前 评论

5.7版本自带403渲染页面。。上面的全部都作废。。
file

5年前 评论

@hustnzj 大部分用的都是5.5版本的 long term support LTS 版本 长期支持板

5年前 评论

其实正式上线你看到的页面不会是这样的,因为你开了debug,所以看到更加详细的提示

错误的详细信息
config/app.php 配置文件的 debug 选项决定了是否向用户显示错误信息。默认情况下,此选项设置为获取存储在 .env 文件中的 APP_DEBUG 环境变量的值。

对于本地开发,应该将 APP_DEBUG 环境变量设置为 true 。而在生产环境中,此值应始终保持 false 。如果你在生产中将该值设置为 true ,则有可能会将敏感的配置信息暴露给应用程序的最终用户。

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!