Laravel授权()混淆

时间:2015-03-03 16:57:51

标签: php laravel laravel-5

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

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

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

唯一的问题是,当我从false返回authorize()时,它只会加载一个写有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(),而不是单个方法,这是进步,我猜。

3 个答案:

答案 0 :(得分:6)

我所做的是为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);
    }
}

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

class CreateUserRequest extends FormRequest {

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

    }
}