2015-03-03 2 views
4

В настоящее время я переношу проект с CodeIgniter на Laravel5.Laravel Authorize() confusion

Я видел в Laracasts, что вы можете использовать метод Request::authorize() для авторизации доступа до вызова контроллера и возвращает true или false.

Это было бы (я думаю) идеальным решением, поскольку я могу содержать проверки разрешений внутри запроса, а не загрязнять контроллер с помощью проверок разрешений и перенаправления/ответов.

Единственная проблема в том, когда я вернусь из falseauthorize(), он просто загружает пустая белая страница с forbidden написана, и я не могу найти никакой документации по laravel.com о том, как шаблоне его (или нет документации , или я его не замечаю)

Я знаю, что могу редактировать страницу 404 в errors/404.blade.php, но я не могу решить, как настроить страницу 403, в которой я попытался добавить пользовательскую страницу 403.blade.php, которая не отображается. (https://mattstauffer.co/blog/laravel-5.0-custom-error-pages)

Является ли это разрешение на проверку в запросе хорошей идеей? Или я чего-то не хватает?

Update Я побежал трассировку от authorize(), и, похоже, он бросает UnauthorizedException, который проходит RuntimeException. Я попытался поймать обоих в файле routes.php, который тоже не работает.

Я также пытался создать промежуточное программное обеспечение и вызывать промежуточное ПО из метода, который тоже не работает, поскольку промежуточное программное обеспечение даже не вызвано вообще.

Update 2 Итак, я узнал, что я могу назвать только $this->middleware() из конструктора, а не отдельных методов, что прогресс, я думаю.

ответ

6

Что я делаю, это добавить метод 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 ошибок.

Последнее, что не забудьте проверить внутри вашего конфигурационного файла веб-сервера (httpd.conf для Apache, sites-available\your-host для Nginx), если у вас есть поведение по умолчанию для любой ошибки. Если вы используете Homestead, вы можете проверить конфигурационный файл Nginx на что-нибудь вроде error_page 404 /index.php;, прокомментировать строку и перезапустить службу. Это не идеальный сценарий, но обычно работает.

+0

К сожалению, это не работает либо. Я заставил ошибку в методе authorize(), который создал обратную линию.После того, как вы вернетесь назад, после отказа авторизации(), он вызывает только «UnauthorizedException», который расширяет «RuntimeException». Я попытался поймать обоих в файле route.php, который тоже не работает. –

0

Override метод внутри вашего объекта формы запроса

class CreateUserRequest extends FormRequest { 

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

    } 
}