2015-08-03 6 views
1

Я пытаюсь расширить Laravel-5.1 Auth промежуточное программное обеспечение, так что я могу добавить свой собственный метод к нему:Laravel-5 добавив метод hasRole авторизовать

Auth::hasRole()

Что мне нужно сделать в добавить новый метод hasRole to Auth?

Вот файл мои маршруты:

/* Administrator Routes */ 

Route::group(['namespace' => 'Admin', 'middleware' => 'timesheets.admin:Administrator'], function() 
{ 
    Route::get('home', '[email protected]'); 
}); 

Вот мой промежуточного файла:

<?php 

namespace App\Http\Middleware\Auth; 

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

class AdminAuthenticate 
{ 
    /** 
    * The Guard implementation. 
    * 
    * @var Guard 
    */ 
    protected $auth; 

    /** 
    * Create a new filter instance. 
    * 
    * @param Guard $auth 
    * @return void 
    */ 
    public function __construct(Guard $auth) 
    { 
     $this->auth = $auth; 
    } 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next, $role) 
    { 
     if ($this->auth->guest()) { 
      if ($request->ajax()) { 
       return response('Unauthorized.', 401); 
      } else { 
       return redirect()->guest('login'); 
      } 
     } 

     if (auth()->check() && auth()->user()->hasRole($role)) { 
      return $next($request); 
     } 

    } 
} 
+2

Если вы хотите, чтобы это часть класса Auth, а не модель User, вам необходимо расширить класс Auth. – ceejayoz

ответ

13

Не могли бы вы попробовать добавить следующие строки в модели пользователя: -

public function hasRole($role) 
{ 
    return User::where('role', $role)->get(); 
} 

Это следует сначала проверить, есть ли в таблице пользователя поле «роль», а затем проверить свой параметр $role против t он role раздел.

Вы можете проверка, выполнив следующие действия:

if(Auth::user()->hasRole($role)) 

Вам может понадобиться настроить пример для ваших нужд. Позвольте мне знать, если вам нужно что-нибудь еще.

/------------ EDIT -----------------/

Если у вас есть два отдельных таблиц, один держа информация о пользователе, а другой держит пользователей привилегии/роли, которые вы могли бы добавить еще одну функцию в модели пользователя:

public function userID() 
{ 
    return $this->user_id; 
} 

Это будет проверять, если у вас есть идентификатор пользователя поле, если да, то он возвращает идентификатор для проверки подлинности пользователь.

Затем добавьте в ваш метод hasRoles:

public function hasRoles($userID, $roles) 
{ 
    return Your\User\Roles\Model::where('role', $role)->where('user_id', $user_id)->get(); 
} 

Ваш промежуточный слой будет выглядеть следующим образом:

public function handle($request, Closure $next, $role) 
{ 
    if ($this->auth->guest()) { 
     if ($request->ajax()) { 
      return response('Unauthorized.', 401); 
     } else { 
      return redirect()->guest('login'); 
     } 
    } 

    $userID = Auth::user()->userID(); 

    if (auth()->check() && auth()->user()->hasRole($userID, $role)) { 
     return $next($request); 
    } 

} 

Если я правильно понял, что вы хотите. Я считаю, что это должно сработать для вас.

+2

Я согласен, что это должно быть частью модели User. – ceejayoz

+1

еще один запрос? роль - это поле? – M0rtiis

+0

Извините, ребята, я должен был сказать вам это в своем оригинальном посте. 'role' не является полем в моей таблице users. Роли пользователей хранятся в отдельной таблице. – V4n1ll4

0

Я взял другую тактику, используя черту в моей User модели.

<?php 
namespace App\Traits; 

use App\Role; 
use App\User; 

trait HasRoles{ 
    public function roles() 
    { 
     return $this->belongsToMany('App\Role'); 
    } 

    public static function findByRole(Role $role) 
    { 
     return $role->users()->get(); 
    } 

    public function hasRole(Role $role) 
    { 
     return $this->roles()->get()->contains($role); 
    } 
} 
Смежные вопросы