【问题标题】:Laravel Authorize() confusionLaravel Authorize() 混淆
【发布时间】:2015-03-03 16:57:51
【问题描述】:

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

我在 Laracasts 中看到可以在调用控制器之前使用Request::authorize() 方法来授权访问,它返回 true 或 false。

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

唯一的问题是,当我从 authorize() 返回 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(),而不是单个方法,我猜这是进步。

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    我所做的是向 Request 抽象类添加一个 forbiddenResponse() 方法。您可以从该方法返回响应对象以呈现人类可读的错误。

    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);
        }
    }
    

    【讨论】:

    • 抱歉,我花了一段时间才回来,我一直在做其他事情。我刚刚测试了你的方法,效果很好,而且比我以前做的简单得多!非常感谢您的回答。
    【解决方案2】:

    检查app\Exceptions\Handler.php 文件。您可以在此处自定义异常处理。

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

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

    【讨论】:

    • 不幸的是,这也不起作用。我在产生回溯的 authorize() 方法中强制出错。跟踪它后,如果授权()失败,它只会抛出一个扩展RuntimeExceptionUnauthorizedException。我已经尝试在 routes.php 文件中捕获这两个文件也不起作用。
    【解决方案3】:

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

    class CreateUserRequest extends FormRequest {
    
        public function forbiddenResponse(){
            return abort(403);
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-28
      • 2018-09-29
      • 2015-07-20
      • 2013-03-23
      • 2014-02-12
      • 2017-06-14
      • 1970-01-01
      • 2018-03-04
      相关资源
      最近更新 更多