Laravel tabanlı yapılar için basit ve hafif kullanıcı grupları ve yetkileri sistemi.
- Migration dosyasını kullanarak veri tabanı için gerekli tabloları oluşturun;
php artisan migrate
- Laravel'in app.php config dosyasının
providers
alanına ayrıca aşağıdaki satırı ekleyin;
<?php
'providers' => [
CodeForms\Repositories\Crew\Providers\CrewServiceProvider::class,
]
- app/Http/Kernel.php dosyasındaki
routeMiddleware
bölümüne ayrıca aşağıdaki satırları ekleyin.
<?php
protected $routeMiddleware = [
'role' => \CodeForms\Repositories\Crew\Middleware\RoleMiddleware::class,
'permission' => \CodeForms\Repositories\Crew\Middleware\PermissionMiddleware::class,
];
- Son olarak
app/User.php
model dosyanıza CrewTrait dosyasını ekleyin;
<?php
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use CodeForms\Repositories\Crew\Traits\CrewTrait;
class User extends Authenticatable
{
use Notifiable, CrewTrait;
Rol ve yetkiler, klasik CRUD işlemleriyle oluşturulur. CRUD işlemleri için Models
dizininde yer alan Role ve Permission model dosyaları kullanılmalıdır.
Role ve Yetki oluştururken kaydedilecek olan 'slug' verisi, tüm sorgu işlemleri için birincil ölçüttür.
role()
metoduyla sadece belirttiğiniz role sahip kullanıcıları alırken, exceptRole()
metoduyla belirttiğiniz roller dışındaki tüm kullanıcıları alabilirsiniz. Rol isim veya isimleri (slug adları) tek bir string veya array
içinde çoklu olarak tanımlanabilir.
<?php
User::role('admin')->get(); // sadece admin kullanıcıları
User::role(['admin', 'editor'])->get(); // sadece admin ve editor kullanıcıları
User::exceptRole('admin')->get(); // admin dışındaki tüm kullanıcıları
User::exceptRole(['editor', 'customer'])->get(); // editor ve customer dışındaki tüm kullanıcıları
Tüm sorgulama metotları her zaman bool (true/false) döner. Aşağıdaki örnekler PHP kodları içinde kullanılır.
<?php
$user = User::find(1);
# bir kullanıcı için rol(ler) sorgulama
$user->hasRole('Admin');
$user->hasRole(['Admin', 'Editor']);
# bir kullanıcı için yetki(ler) sorgulama
$user->hasPermission('edit-post');
$user->hasPermission(['edit-post', 'delete-post']);
<?php
# bir kullanıcıya rol atama
$user->setRole('Admin');
$user->setRole(['User', 'Customer']); // array olarak çoklu atama
# bir kullanıcıya yetkiler atama
$user->setPermission('edit-post');
$user->setPermission(['edit-post', 'delete-post', 'upload']); // array olarak çoklu atama
<?php
$role = Role::find(1);
# bir rol için yetki sorgulama
$role->hasPermission('edit-post');
$role->hasPermission(['edit-post', 'delete-post']);
# bir role yetki(ler) atama
$role->setPermission('edit-post');
$role->setPermission(['edit-post', 'delete-post', 'upload']); // array olarak çoklu atama
<?php
$permission = Permission::find(1);
# bir yetki için rol/ler atama
$permission->roles()->sync([1,2,3]);
Laravel'in blade şablon dosyalarında da rol ve yetki sorgulaması kolaylıkla yapılabilir.
@role('Editor')
Bu alanı sadece Editor rolüne sahip olan kullanıcılar görebilir.
@else
Bu alanı editörler göremez ancak editör dışındaki diğer rollere sahip olanlar görebilir.
@endrole
@role(['Editor', 'Admin'])
Bu bölümü sadece Editor ve Admin rolüne sahip olanlar görebilir.
@endrole
Blade dosyaları içinde yetki sorgulamak için Laravel'in varsayılan @can direktifi kullanılabilir.
@can('edit-post')
'edit-post' yetkisine sahip olanlar görebilir.
@endcan
Crew yapısı sayesinde rol ve yetkiler aynı zamanda rotalarda da kullanılabilir. Yetki veya roller, rotanın middleware
alanında belirtilir. Birden fazla rol ve yetki belirtmek istediğimizde, her bir rol ve yetki arasına '|' dik çizgi (pipe) işareti konulur.
<?php
# aşağıdaki 'admin' sayfasına sadece 'dashboard 'yetkisine
# sahip olan kullanıcılar veya bu yetkiye sahip roller erişebilir
Route::get('admin', 'DashboardController@index')->middleware('permission:dashboard');
# aşağıdaki içerik düzenleme sayfasına sadece 'dashboard' ve 'edit-post'
# yetkisine sahip kullanıcılar veya bu yetkiye sahip roller erişebilir.
Route::get('admin/post/{id}', 'DashboardController@edit')->middleware('permission:dashboard|edit-post');
# Bu rotaya sadece 'Admin' rolüne sahip olanlar erişebilir
Route::get('admin/users', 'BackendUserController@index')->middleware('role:Admin');
# Bu rotaya sadece Admin veya Editor rolüne sahip olanlar erişebilir
Route::get('admin/posts', 'BackendPostController@index')->middleware('role:Admin|Editor');
Bir rota grubu için tanımlanan rol veya yetkiler, grup içinde tanımlanacak olan tüm rotalar için geçerli olur. Böylece her bir rota için ayrı ayrı middleware tanımlaması yapılmaz.
<?php
Route::group([
'prefix' => 'admin/dashboard',
'middleware' => 'role:Admin|Editor'
], function ()
{
/**
* Aşağıdaki rotalara sadece Admin ve Editor rollerine
* sahip kullanıcılara erişebilir.
*/
Route::get('posts', 'BackendPostController@index');
Route::get('posts/{id}', 'BackendPostController@edit');
});
<?php
Route::group([
'prefix' => 'admin/dashboard',
'middleware' => 'permission:edit-post|delete-post'
], function ()
{
Route::get('posts', 'BackendPostController@index');
# bir kullanıcı, rota grubunda belirtilen yetkilere (edit-post, delete-post)
# sahip olsa bile, eğer bu rotada ek olarak belirtilen 'upload' yetkisine sahip değilse
# bu rotaya erişemez.
Route::get('posts/{id}', 'BackendPostController@edit')->middleware('permission:upload');
# bir kullanıcı, rota grubunda belirtilen yetkilere (edit-post, delete-post)
# sahip olsa bile, eğer 'Admin' değilse bu rotaya erişemez.
Route::post('posts/{id}/delete', 'BackendPostController@delete')->middleware('role:Admin');
});