2015-03-14 21 views
5

Tôi mới ở Laravel. Tôi đang cố gắng sử dụng trong Laravel 5 Zizaco/entrust (từ nhánh Laravel-5). Tất cả làm việc ok - đính kèm các quy tắc, tách quy tắc ... nhưng khi tôi thử kiểm tra quyền tôi có vấn đề.Laravel 5, Entrust - kiểm tra vai trò không hoạt động

Trước tiên, tôi thử trong routes.php, nhưng tại nơi này Entrust không biết tôi là ai, hasRolerouteNeedsRole không hoạt động trong routes.php.

Trong phần mềm trung gian hasRole đang hoạt động nhưng routeNeedsRole thì không. Đang cố gắng sử dụng làm chuỗi thông số thứ hai, mảng, cùng một hiệu ứng - abort(403) chạy.

hasRole đang làm việc vấn đề này trông rất lạ đối với tôi.

composer dump-autoload - sử dụng, không giải quyết vấn đề

trong routes.php

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

trong middleware

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

Mô hình của tôi user.php

01.235.
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]" ]); 
}); 

Tôi cũng có vai trò và Quyền Lợi mô hình trông giống như trong Readme nộp https://github.com/Zizaco/entrust/tree/laravel-5

// xin lỗi vì tiếng anh của tôi.

Trả lời

0

Hãy thử nó trong bộ điều khiển của bạn:

Auth :: người dùng() -> hasRole ('trị cấp cao');

+0

Cảm ơn bạn đã trả lời nhưng tôi cần sử dụng Entrust cho việc này. –

+0

Theo tài liệu Entrust, điều này giống hệt với việc sử dụng 'Entrust :: hasRole ('superadmin'); ' – Fuseblown

11

Cập nhật: Laravel 5.1.11 và phiên bản mới hơn được tích hợp sẵn trong Authorization. Laravel thân thiện hơn nhiều và sẽ luôn được duy trì tốt. Sử dụng này khi có thể


Bạn đang sử dụng middleware sai. Có rất nhiều thứ trong Laravel 4 vẫn còn trong tài liệu cho Entrust, do đó bạn phải chọn lọc như những gì bạn sử dụng từ đó. Phần mềm trung gian không được đặt routeNeedsRole. Trên thực tế, routeNeedsRole không thực sự phù hợp với L5 theo ý kiến ​​của tôi. Dưới đây là cách tôi sẽ làm điều đó:

Tạo một middleware mới với

php artisan make:middleware AuthAdmin 

Bây giờ trong ứng dụng mới được tạo/Http/Middleware/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); 
    } 

} 

này sẽ làm tương tự điều như middleware auth nhưng nếu họ đã đăng nhập và không có vai trò 'superadmin' họ sẽ nhận được 404.

Tiếp theo, chúng ta cần thêm phần mềm trung gian vào routemiddleware. Thực hiện việc này trong app/Http/Kernal.php:

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

Điều này làm cho nó có thể thêm phần mềm trung gian vào bộ điều khiển. Bây giờ hãy làm điều đó. Trong bộ điều khiển của bạn, chúng tôi thực hiện điều này trong hàm tạo:

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

Điều này sẽ thêm phần mềm trung gian vào toàn bộ bộ điều khiển. Bạn có thể được cụ thể như các tuyến đường nếu cần thiết nhưng đối với trường hợp của bạn tôi sẽ giả định chúng ta cần toàn bộ điều khiển được bảo vệ.

Hãy cho tôi biết nếu bạn cần trợ giúp thêm này. Nó sẽ là lý tưởng để làm cho AuthAdmin chạy phần mềm trung gian 'auth' thay vì sao chép mã nhưng tôi không biết cách làm điều đó từ bên trong phần mềm trung gian và chúng tôi không muốn phải làm middleware => ['auth', 'superadmin'] thay vì chỉ 'superadmin'. Nếu chúng tôi không sao chép mã 'auth' qua, chúng tôi sẽ cố gắng để có được ->hasRole() của null sẽ gặp lỗi.

+2

Câu trả lời hay, chi tiết và nó hoạt động tốt cho tôi. Điều này sẽ được đánh dấu là câu trả lời được chọn bởi OP. – Fuseblown

Các vấn đề liên quan