Laravel 授权()混乱

Laravel Authorize() confusion

我目前正在将一个项目从 CodeIgniter 迁移到 Laravel5。

我在Laracasts看到可以在controller调用前使用Request::authorize()方法授权访问,return是真还是假。

这(我认为)是理想的解决方案,因为我可以在请求中包含权限检查,而不是用权限检查和重定向/响应污染控制器。

唯一的问题是,当我从 authorize() return false 时,它只是加载一个写有 forbidden 的空白页面,我找不到laravel.com 关于如何对其进行模板化的任何文档(没有文档,或者我忽略了它)

我知道我可以在 errors/404.blade.php 中编辑 404 页面,但我不知道如何自定义 403 页面,我已经尝试添加自定义 403.blade.php 页面,没有显示。 ( https://mattstauffer.co/blog/laravel-5.0-custom-error-pages )

将这些权限检查放在请求中是个好主意吗?还是我遗漏了什么?

更新 我 运行 来自 authorize() 的回溯,看起来它抛出了 UnauthorizedException,它扩展了 RuntimeException。我试过在 routes.php 文件中同时捕获这两个文件,这也不起作用。

我也试过创建中间件,并从一个方法调用中间件,这也不起作用,因为根本没有调用中间件。

更新 2 好的,所以我发现我只能从构造函数中调用 $this->middleware(),而不是个别方法,我猜这是进步。

检查 app\Exceptions\Handler.php 文件。这是您可以自定义异常处理的地方。

403 错误启动 HttpException。默认情况下,Laravel 将在您的 resources\views\errors\ 目录下查找并尝试找到对应于相同状态代码的视图。由于您已经说过您已经在该文件夹中创建了一个名为 403.blade.php 的文件,因此它应该呈现此页面以显示 403 错误。

最后一件事,如果您有任何错误的默认行为,请记住检查您的 Web 服务器配置文件(httpd.conf 用于 Apache,sites-available\your-host 用于 Nginx)。如果您使用的是 Homestead,您可以检查 Nginx 配置文件中是否有任何类似 error_page 404 /index.php; 的内容,注释该行并重新启动服务。这不是理想的场景,但通常可行。

我所做的是向请求摘要 class 添加一个 forbiddenResponse() 方法。您可以 return 来自该方法的响应对象来呈现人类可读的错误。

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\JsonResponse;

abstract class Request extends FormRequest {

    public function forbiddenResponse()
    {
        return new JsonResponse('Unauthorized', 403);
        // or return Response::make('Unauthorized', 403);
    }
}

覆盖表单请求对象中的方法

class CreateUserRequest extends FormRequest {

    public function forbiddenResponse(){
        return abort(403);

    }
}