2017-02-08 2 views
2

laravel 기본 승인을 얻으려고합니다. 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

서비스 제공 업체의 데이터베이스에 액세스하면 안됩니다. 항상 서비스 제공 업체를 단순하게 유지하십시오. 목적을 달성하기 위해 아래의 단계를 따르십시오.

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

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

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

} 

AuthServiceProvider.class

지금 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

check'$ role'은 null입니다. '$ role'은 콜렉션이어야합니다. – mrabbani

+0

그렇다면 경로에 접근 할 수 없습니다 .. 의미() :() = (null) {return false} return (bool) $ role-> intersect ($ this-> roles) 역할은 role_permission 테이블에 권한이 있습니다.하지만 경로에 액세스 할 수 없습니다. – Hola

관련 문제