Selam Arkadaşlar
Laravel konusunda yeni sayılırım. O yüzden sorularıma; cevaplarınızı biraz basit ve yönlendirmeli alabilirsem sevinirim.
Yapmak istediğim sitenin çoğu aksiyonunu
kullanıcı - rol durumu olmadan yaptım. Laravel'in gelişmiş yapısını bildiğimden kullanıcı-rol kısmını sonra adapte ederim düşüncesiyle proje ilerleyince yapmaya başladım.
Elimde kullanıcı, rol, menü, sayfa, yetki matrisi tablosu var.
Bazı kolonları yazmadım.
user -> id, username(mail yok),password, remember_token
-> kullanıcı giriş bilgilerini tutuyorum.
auth_types -> id, name
-> kullanıcı tiplerini tutuyorum, SüperAdmin, Admin, Yetkili, Eğitmen, Çalışan, Misafir (Daha fazla da eklenebilir.)
user_authorities -> user_id, auth_types_id
-> kullanıcı yetki matrisini tutuyorum.
Dinamik menü oluşturmak için Menü - Sayfa listesi yapıldı.
nav_list -> id, name, align
page_list -> id, nav_id, name, link, align
Yetkiye göre menüdeki sayfaları göstermek için bir de matris tablosu oluşturdum.
auth_page_matrix -> id, auth_types_id, page_id
Buraya kadar genel yapıyı söyledim.
Aşağıda
web.php ve
LoginController.php içeriğini ekledim.
web.php
/* Index */
Route::get('/', 'UserController@login');
Auth::routes();
View::composer('*', function ($view) {
$view->with('layouts.nav');
});
Route::get('/logout', 'UserController@destroy'); //This for just test not for sites
Route::get('/', 'UserController@main');
Route::get('/home', 'UserController@main');
Route::get('/index', 'UserController@main');
/* Works */
Route::get('/works', 'WorksController@index');
Route::get('/works/my', 'WorksController@myIndex');
Route::get('/works/my/{id}', 'WorksController@show');
Route::get('/works/create', 'WorksController@create');
Route::post('/works', 'WorksController@store');
Route::get('/works/{id}/edit', 'WorksController@edit');
/* Versions */
Route::get('/versions', 'VersionsController@try');
Route::get('/versions/create', 'VersionsController@create');
Route::post('/versions', 'VersionsController@store');
Route::get('/versions/content', 'VersionsController@content');
Route::get('/versions/content/{id}', 'VersionsController@index');
Route::post('/versions/content/{id}', 'VersionsController@add');
Route::get('/versions/content/{v_id}/delete/{vu_id}', 'VersionsController@delete');
LoginController.php
// Üstekileri eklemedim.
protected function credentials(Request $request)
{
$credentials = $request->only($this->username(), 'password');
$credentials['status'] = 1;
return $credentials;
}
protected function sendLoginResponse(Request $request)
{
$request->session()->regenerate();
$user_id = User::where('username', '=', $request['username'])->get()->first()->id;
$user_role = UserAuth::where([
['user_id', '=', $user_id],
['status', '=', '1']
])->get()->first()->auth_types_id;
$user_detail = UserDetail::where('user_id', '=', $user_id)->get()->first();
if (UserTitle::where([['user_id', '=', $user_id], ['status', '=', '1']])
->orderBy('id', 'desc')->get()->count() > 0
) {
$user_title = UserTitle::where([['user_id', '=', $user_id], ['status', '=', '1']])
->orderBy('id', 'desc')->get()->first();
$user_title_name = TitleType::where('id', '=', $user_title->title_types_id)->get()->first()->name;
} else {
$user_title_name = '';
}
Session::put('username', $request['username']);
Session::put('user_id', $user_id);
Session::put('user_role', $user_role);
Session::put('user_detail', $user_detail);
Session::put('user_title_name', $user_title_name);
$this->clearLoginAttempts($request);
return $this->authenticated($request, $this->guard()->user())
?: redirect()->intended($this->redirectPath());
}
Soruma gelmeden son bilgiler.
Yönetici sayfası ayrıca bir sayfa değildir. Her menüde istediği ayarların yapılabilmesi için ayar sayfaları mevcuttur. Bunlar üzerinden yönetilmektedir.
Kullanıcı tipi ne olursa olsun giriş yapmamışsa login ekranı gözükmeli.
Eğer bir session oluşmuşsa index sayfasına yönlendirebilmeliyim.
Eğer yetkisi varsa menüdeki sayfalara tıklayıp açabilmeli.
Link yazarken erişmek isterse ve yetkisi yoksa hata sayfası verip anasayfaya yönlendirmeyi düşünüyorum.
Problemim şu
Ben
role göre belli sayfalara erişimi kısıtlamak veya izin vermek istiyorum.
Bunu 2-3 türlü denedim.
- Birincisi Route dosyası içerisinde session olmadığı durumda
if(session) { route ... } else {route login} gibi diyerek yapmaya çalıştım. Misal
/versions dediğim zaman bana route bulunamadı hatası döndürdü. session olduğu zamanda logine sürekli dallandırdı. Çözemedim vazgeçtim.
- Her sayfayı oluşturan fonksiyona kullanıcı rol karşılaştırması yapmayı düşündüm. Her birine böyle bir kontrol yapmak hem mantıklı gelmedi hemde MVC yapısına uymadığını düşünüyorum.
- Sonuç olarak araştırdığım kadarı ile
Route -> middleware-> auth olayı filan var ama bunun mantığını çözemedim. Bir de kendi yaptığım projeye uygulama konusunda benzer örnek bulamadığımdan yapamadım.
Bir fikri olan, fikir ile birlikte nasıl yapıldığını göstermesini de bekliyorum.
Yardımlarınız için şimdiden teşekkürler...
Ek Bilgi: (Düzeltme)
Bu arada atladığım bir durum var.
Şuan kullanıcı bilgileri ile giriş yapıp, yetkisine göre hangilerini görebilecekse o menüleri görebiliyor. Diğerlerini göremiyor.
Göremediklerine linki yazarak gitmek istediğimde engellemek istiyorum. Asıl mesele bu aslında.