2017-02-08 18 views
2

私はlaravelの基本認証をしようとしています。私はラベール認可のためにゲートを使用しています。Laravel Gate:承認が機能しない

表構造

User Table, Permission Table, Role, role_permission table 

user : id, name , password, email 
permission : id, name 
role:id , name 
role_permission: id, role_id, permission_id 

authServiceProvider

public function boot(GateContract $gate) 
{ 
    $this->registerPolicies(); 

    foreach($this->getPermissions() as $permission) 
    { 
     $gate->define($permission->name,function($user) use($permission){ 
     return $user->role->id == $permission->role_id;    
      }); 
    }  
} 

public function getPermissions() 
{ 

    $permissions = \DB::table('role_permission') 
     ->join('permissions', 'permissions.id', '=', 'role_permission.permission_id') 
     ->select('role_permission.*','permissions.*') 
     ->get(); 
    return $permissions; 

} 

それは正しく、それが適切なユーザーに許可テーブルでありますけれども、私はルートにアクセスすることはできません意味は動作しません。

+0

そこにはコメントアウトされていない 'dd()'があります...また、これはやや非効率です。システム内のすべての権限ではなく、ユーザーの権限だけを照会することができます。 –

+0

あなたの質問から 'dd($ permission)'を削除します。 – Onix

+0

は、私は実際にあなたが – Hola

答えて

1

サービスプロバイダからデータベースにアクセスすべきではありません。常にサービスプロバイダをシンプルにしてください。あなたの目的に合うように、以下の手順に従ってください。今

AuthServiceProvider.class

public function boot(GateContract $gate) 
{ 
    $this->registerPolicies($gate); 

    $gate->before(function($user, $ability) { 

      return $user->hasPermission($ability); 
    }); 

} 

App\Userモデルで以下のメソッドを追加します。

public function hasPermission($name) 
{ 
    $permission = Permission::where('name','=', $name)->first(); 
    if(! $permission) { 
     return false; 
    } 

    return $this->hasRole($permission->roles); 
} 

public function hasRole($role) 
{ 
    if (is_string($role)) { 
     return $this->roles->contains('name', $role); 
    } 

    return (bool) $role->intersect($this->roles)->count(); 
} 

これがあなたの目的に役立つことを願っています。

+0

をしてくださいチェックupdated..Now持っている私は '次のエラー>> を得ました コードの最後の行.. – Hola

+0

チェック '$ role'はnullです。 '$ role'はコレクションでなければなりません。 $ role-> intersect($ this-> roles) - > count(); ' – mrabbani

+0

私はルートにアクセスすることはできません..手段ロールはrole_permissionテーブルの権限を持っています..しかし、私はルートにアクセスすることはできません。 – Hola

関連する問題