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);
}
}
我目前正在将一个项目从 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);
}
}