2015-03-14 4 views
5

Я новичок в Laravel. Я пытаюсь использовать в Laravel 5 Zizaco/entrust (из ветки laravel-5). Все работает нормально - присоединяйте правила, отключайте правила ... но когда я пытаюсь проверить разрешения, у меня проблемы.Laravel 5, Entrust - контрольные роли не работают

Сначала я пытаюсь в route.php, но в этом месте Entrust не знаю, кто я, hasRole и routeNeedsRole не работает в routes.php.

В промежуточном программном обеспечении hasRole работает, но routeNeedsRole нет. Попытка использования в качестве второй строки параметров, массива, того же эффекта - abort(403) работает.

Потому что hasRole работает эта проблема выглядит очень странно для меня.

composer dump-autoload - используется, а не решить проблему

в routes.php

Entrust::hasRole('superadmin');// => false 
\Entrust::routeNeedsRole('admin/dashboard', ['superadmin'], abort(403, 'Forbidden'), false); // display 403 page 

в промежуточного

\Entrust::hasRole('superadmin'); // => true 
\Entrust::routeNeedsRole('admin/dashboard', ['superadmin'], abort(403, 'Forbidden'), false); // display 403 page 

Моя модель User.php

use Zizaco\Entrust\Traits\EntrustUserTrait; 

class User extends Model implements AuthenticatableContract, CanResetPasswordContract { 

use Authenticatable, CanResetPassword, EntrustUserTrait; 

routes.php

Route::group([ 'prefix' => 'admin', 'namespace' => 'Admin', 'middleware' => ['auth', 'admin']], function(){ 
    Route::get('dashboard', [ 'as' => 'dashboard', 'uses' => "[email protected]" ]); 
}); 

У меня есть также модели ролей и прав выглядит в Readme файл https://github.com/Zizaco/entrust/tree/laravel-5

// простите за мой английский.

ответ

0

Попробуйте в контроллерах:

Auth :: пользователя() -> hasRole ('суперамин');

+0

Благодарим за сообщение, но для этого мне нужно использовать Entrust. –

+0

В соответствии с документацией Entrust это идентично использованию 'Entrust :: hasRole ('superadmin');' – Fuseblown

11

Обновление: Laravel 5.1.11 и новее теперь со встроенным Authorization. Это гораздо более дружелюбный Laravel и всегда будет в хорошем состоянии. Используйте это, когда это возможно


Вы используете промежуточное неправильно. В документах для Entrust есть много материалов Laravel 4, поэтому вы должны быть избирательными относительно того, что вы используете оттуда. В промежуточном программном обеспечении не должно быть routeNeedsRole. На самом деле routeNeedsRole, по-моему, не подходит для L5. Вот как бы я это сделать:

Создать новую промежуточный программные

php artisan make:middleware AuthAdmin 

Теперь в вновь созданном приложении/Http/Промежуточный/AuthAdmin.php

<?php namespace App\Http\Middleware; 

use Closure; 
use Illuminate\Contracts\Auth\Guard; 

class AuthAdmin { 

    protected $auth; 

    public function __construct(Guard $auth) { 
    $this->auth = $auth; 
    } 

    public function handle($request, Closure $next) { 
    if ($this->auth->guest()) { 
     if ($request->ajax()) { 
     return response('Unauthorized.', 401); 
     } else { 
     return redirect()->guest('auth/login'); 
     } 
    } else if(! $request->user()->hasRole('superadmin')) { 
     return abort(404); //Or redirect() or whatever you want 
    } 
    return $next($request); 
    } 

} 

Это будет делать то же самое в качестве промежуточного ПО auth, но если они уже вошли в систему и не имеют роли «superadmin», они получат 404.

Далее нам нужно добавить промежуточное программное обеспечение для маршрутизации. Делайте это в app/Http/Kernal.php:

protected $routeMiddleware = [ 
    ..., 
    'superadmin' => 'App\Http\Middleware\AuthAdmin', 
]; 

Это позволяет добавить к промежуточному контроллеру. Теперь давайте сделаем это. В вашем контроллере мы делаем это в конструкторе:

public function __construct() { 
    $this->middleware('superadmin'); 
} 

Это добавит промежуточное ПО ко всему контроллеру. Вы можете быть конкретными относительно маршрутов, если это необходимо, но для вашего случая я бы предположил, что нам нужен весь контроллер.

Сообщите мне, если вам нужна дополнительная помощь.

Примечание: Было бы идеально, чтобы сделать AuthAdmin запустить «» аутентификации промежуточного уровня первого вместо копирования кода, но я не знаю, как сделать это внутри промежуточного слоя, и мы не хотим, чтобы в do middleware => ['auth', 'superadmin'] вместо 'superadmin'. Если бы мы не скопировали код «auth», мы бы попытались получить ->hasRole() из null, который получил бы ошибку.

+2

Хороший подробный ответ, и он отлично подойдет для меня. Это должно быть отмечено как выбранный ответ OP. – Fuseblown

Смежные вопросы