[英]Laravel Authorize() confusion
我目前正在将一个项目从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()
,而不是单个方法,这是进步,我猜。
我所做的是为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);
}
}
检查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;
,注释该行并重新启动该服务。 这不是理想的情况,但通常有效。
覆盖表单请求对象中的方法
class CreateUserRequest extends FormRequest {
public function forbiddenResponse(){
return abort(403);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.