Sentry | Laravel Üyelik Paketi
Kaynak:https://medium.com/@BeyazitKolemen/sentry-laravel-uyelik-paketi-e29ace9aaed
Sentry | Laravel Üyelik Paketi
Laravelin üzerinden gelen Authentication sınıfına ek olarak CARTALYST ekibi tarafından hazırlanan oldukça güzel bir üyelik sınıfını kısaca anlatmak istedim.
Sentry
üyelik sınıfı üzerinde bir çok üyelik sınıfının gerektirdiği
özellikleri fazlasıyla taşıyan, üyelik grupları, üyelik izinleri
(banlama,suspend vs) gibi bir çok özelliği üzerinde bulunduran güzel bir
paket olmuş.
Şifre hatırlatma,üyelik kayıt, aktivasyon gibi gelişmiş düzeyde bir üyelik sistemini kolaylıkla kullanabilme imkanı sunuyor.
Kurulum
Laravel 4 üzerinde kurulumunu bir kaç adımda gerçekleştirmeniz mümkün.
Composer.json dosyamıza;
"cartalyst/sentry": "2.1.*"
ekledikten sonra
php composer update
yaparak sentry dosyalarını indiriyoruz.
Ardından frameworkumuza tanımlamak için;
app/config/app.php de $providers’a
'Cartalyst\Sentry\SentryServiceProvider',
satırını ekleyip
$aliases bölümünü de
'Sentry' => 'Cartalyst\Sentry\Facades\Laravel\Sentry',
satırını ekliyoruz.
Son olarak composer üzerinden
php artisan migrate --package=cartalyst/sentry
yaparak Sentry SQL tablolarını oluşturuyoruz.
php artisan config:publish cartalyst/sentry
ve son olarak yayına alıyoruz.
Sentry:CreateUser ve Üyelik Kaydı
$user = Sentry::createUser(array( 'email' => 'john.doe@example.com', 'password' => 'test', 'activated' => true ));
Şeklinde kolaylıkla üyelik kaydı yapabileceğimiz sistem için örnek olarak kullandığım basit bir üye kayıt fonksiyonu.
public function kayit() {
$sartlar = array( ‘isim’ => ‘required’, ‘email’ => ‘email|unique:users’, ‘sifre’ =>’required|alpha_num|between:6,12|same:sifre_dogrula’ );
$mesaj = array( ‘isim.required’ => ‘Kullanıcı Ad / Soyad Alanını Girmelisiniz.’, ‘email.email’ => ‘Email Adresi Geçersiz.’, ‘sifre.same’ => “Girdiğiniz şifreler birbiriyle uyumsuz.”, ‘sifre.between’ => “Şifreniz En Az 6, En Fazla 12 Karakterli Olmalıdır.”, ‘sifre.alpha_num’ => “Şifrenizde en az bir harf ve bir sayı olmalıdır.”, ‘sifre.required’ => ‘Kullanıcı Şifresi Girmediniz.’, ‘kullaniciadi.unique’ => ‘Bu kullanıcı adı daha önce alınmış.’, ‘email.unique’ => ‘Bu e-mail adresi daha önce kullanılmış.’
);
$veri = Input::except(‘_token’, ‘_method’);
$dogrulama = Validator::make($veri, $sartlar,$mesaj);
if ($dogrulama->fails()) { return Redirect::back()->withErrors($dogrulama)->withInput(); } else {
try { $user = Sentry::createUser(array( ‘email’ => $veri[“email”], ‘password’ => $veri[“sifre”], ‘first_name’ => $veri[“isim”], ‘last_name’ => $veri[“soyisim”], ‘activated’ => false, )); $activationCode = $user->getActivationCode();
} catch (Cartalyst\Sentry\Users\LoginRequiredException $e) { echo ‘Login field is required.’; } catch (Cartalyst\Sentry\Users\PasswordRequiredException $e) { echo ‘Password field is required.’; } catch (Cartalyst\Sentry\Users\UserExistsException $e) { echo ‘User with this login already exists.’; }
return Redirect::route(‘kayit’)->with(‘mesaj’,’Üyelik Kaydı Başarılı.’);
}
}
Bir formdan gelen verileri validation yaptıktan sonra Sentry::createUser a array olarak gönderip kayıt yapabiliyoruz..
Eğer aktivasyon sistemi kullanıyorsanız $activationCode değişkenini Laravel Mail fonksiyonları aracılığıyla gönderebilirsiniz.
Try-Catch
ile hata ayıklama da yapabilirsiniz ama ben daha öncesinde validation
ile kontrol yaptım (İki kullanımını da göstermek istedim)
Ek
olarak varsayılan users tablosuna ek tablolar ekleyip, createUser
arrayinde o keylere veri gönderebilirsiniz (Örnek: TC,ülke vs)
Sentry::authenticate() ve Üyelik Girişi
Sentry ile üye girişi ve kontrollerini iki farklı şekilde yapabiliyoruz.
Sentry::authenticate()
ve Sentry::authenticateAndRemember() gibi iki farklı şekilde üyelik
girişini yaptırabilirsiniz. Tek farklı ikinci kod da üyelik girişini
belirli bir süre hatırlama işlemi yapıcaktır (Klasik beni hatırla
checkboxu )
// Login credentials $credentials = array( 'email' => 'john.doe@example.com', 'password' => 'password', ); // Authenticate the user $user = Sentry::authenticate($credentials, false);
Giriş
kimliğini doğrulamak için yine benzer şekilde bir inputtan gelen
verileri almak ve hataları göstermek içinse kullandığım basit bir
fonksiyon.
public function giris() { $sartlar = array( ‘email’ => ‘required|email’, ‘sifre’ => ‘required|alpha_num|between:6,12' ); $mesaj = array( ‘email.required’ => ‘Kullanıcı Adını Girmelisiniz.’, ‘sifre.between’ => “Şifreniz En Az 6, En Fazla 12 Karakterli Olmalıdır.”, ‘sifre.required’ => ‘Kullanıcı Şifresi Girmediniz.’, ); $veri = Input::except(‘_token’, ‘_method’); $dogrulama = Validator::make($veri, $sartlar, $mesaj); if ($dogrulama ->fails()) { return Redirect::back() ->withErrors($dogrulama)->withInput(); } else { $email = $veri[‘email’]; $sifre = $veri[‘sifre’]; try { $credentials = array( ‘email’ => $email, ‘password’ => $sifre, ); // Authenticate the user $user = Sentry::authenticate($credentials, false); } catch(Cartalyst\Sentry\Users\LoginRequiredException $e) { Notification::error(‘Lütfen giriş bilgilerini doldurunuz.’); return Redirect::back(); } catch(Cartalyst\Sentry\Users\PasswordRequiredException $e) { Notification::error(‘Lütfen şifrenizi giriniz.’); return Redirect::back(); } catch(Cartalyst\Sentry\Users\WrongPasswordException $e) { Notification::error(‘Şifreniz yanlış.’); return Redirect::back(); } catch(Cartalyst\Sentry\Users\UserNotFoundException $e) { Notification::error(‘Kullanıcı bulunamadı.’); return Redirect::back(); } catch(Cartalyst\Sentry\Users\UserNotActivatedException $e) { Notification::error(‘Hesabınız aktif değil.Lütfen aktifleştirin.’); return Redirect::back(); } // The following is only required if the throttling is enabled catch(Cartalyst\Sentry\Throttling\UserSuspendedException $e) { Notification::error(‘Hesabınız askıya alındı.’); return Redirect::back(); } catch(Cartalyst\Sentry\Throttling\UserBannedException $e) { Notification::error(‘Hesabınız banlandı.’); return Redirect::back(); } return Redirect::intended(‘/’); } }
Not: Notification paketini kullanarak flash mesaj kullanmıştım. Notification yerine normal bir şekilde hata mesajlarını da gösterebilirsiniz.
Doğrulama sonrası verilerimizi kimlik kontrolüne gönderiyoruz.
Sentry::logout() ve Çıkış Yapma
Logout işlemi içinse çok basit bir fonksiyonla çıkış yapmasını sağlayabilirsiniz.
public function cikisyap() { Sentry::logout(); return Redirect::route(‘anasayfa’); }
Login Kontrolü ve Template Blade
Sentry
kontrolünü tüm sistemde kullanmak için yani her controllera tek tek
uygulamak yerine filters da App:before diyerek tüm uygulamalar
başlamadan kullanabiliriz.
Sentry
üzerinde bir çok üyelik bilgilerini alabileceğiniz fonksiyon
bulunmaktadır.. Ama login olmuş bir kullanıcının en kolay şekilde
bilgilerini alabilmek getUser() fonksiyonuyla mümkün.
App::before(function($request) { View::share(‘user’, Sentry::getUser()); });
Artık tüm template dosyalarımızda $user değişkenimiz aktif durumda.
@if(isset($user))
{{ $user->first_name }}
@else
Giriş yapın
@endif
Şeklinde kolaylıkla kullanabiliriz.
Üyelik Bilgileri Güncelleme
Yine benzer bir şekilde getuser() ile login olan kullanıcının bilgilerini alıp güncelleyebiliriz.
Not: bu giriş yapan kullanıcı kendisi değiştirmek istediğinde kullanılır.
Eğer admin panelinden bir kullanıcı hakkında bilgileri düzeltmek istiyorsanız bir $id alıp
$user = Sentry::findUserById($id);
Kullanıcı bulup düzenlemeniz gerekir. Eğer bu işlemi kullanıcı giriş yapıp kendisi yapıcaksa getUser ile alabilirsiniz.
// Find the user using the user id $user = Sentry::getUser(); // Update the user details $user->email = 'john.doe@example.com'; $user->first_name = 'John'; // Update the user if ($user->save()) { // User information was updated } else { // User information was not updated }
Şeklinde üyelik bilgilerini güncelleyebiliriz..
Yanlız burada korkmayın şifre güncelleme işleminde save fonksiyonu şifreyi yine hashliyor.
Üye Silme
Üye silme işlemi ise oldukça basit bir fonksiyonla yapabilirsiniz.
try { // Find the user using the user id $user = Sentry::findUserById(1); // Delete the user $user->delete(); } catch (Cartalyst\Sentry\Users\UserNotFoundException $e) { echo 'User was not found.'; }
Örnek olarak 1 numaralı id ye ait kullanıcıyı bu şekilde silebilirsiniz.
Üyelik Aktifleştirme
Eğer
üyelik aktifleştirme sistemi kullanıyorsanız ve activasyon kodu
üretiyorsa sisteminiz route da bir activasyon linki oluşturup bir id ile
gelen değişkeni alabilirsiniz.
Örnek olarak mailde;
siteadi.com/aktivasyon/act_id şeklinde mail gönderdiniz diyelim.
Örnek olarak route;
Route::post(‘aktivasyon/{id}’, array(‘as’ => ‘aktivasyon’, ‘uses’ => ‘UyelikController@aktivasyon’));
Şeklinde aktivasyon controllerına id mizi alıp kontrol edelim.
public function aktivasyon($id) {
try { // Find the user using the user id $user = Sentry::getUser(); // Attempt to activate the user if ($user->attemptActivation($id)) { // Aktivasyon başarılı } else { // Aktivasyon başarısız gibi. } } catch (Cartalyst\Sentry\Users\UserNotFoundException $e) { echo 'User was not found.'; } catch (Cartalyst\Sentry\Users\UserAlreadyActivatedException $e) { echo 'User is already activated.'; }
}
Şeklinde giriş yapmış bir kullanıcıyı aktifleştirebilirsiniz.
Şifre Hatırlatma
Üyelik sistemlerinin olmazsa olmazlarından birisi olan üyelik şifresi hatırlatma özelliğini kullanmak içinse;
Örnek olarak;
try { // Find the user using the user email address $user = Sentry::findUserByLogin('john.doe@example.com'); // Get the password reset code $resetCode = $user->getResetPasswordCode(); // Now you can send this code to your user via email for example. } catch (Cartalyst\Sentry\Users\UserNotFoundException $e) { echo 'User was not found.'; }
Finduserbylogin le kullanıcıyı bulup yine yukarıdaki gibi bir formdan mail adresi alıp kullanıcı mailiyle bulabilirsiniz.
Ardından
$resetCode değişkenini Laravelin mail sistemiyle kullanıcıya
gönderirsiniz. Burada password sıfırlama kodu gönderilecektir.
Yine aktivasyonda yaptığımız gibi bir id ile resetcode değişkenini başka bir sayfadan alıp;
try { // Find the user using the user id $user = Sentry::findUserById(1); // Check if the reset password code is valid if ($user->checkResetPasswordCode('8f1Z7wA4uVt7VemBpGSfaoI9mcjdEwtK8elCnQOb')) { // Attempt to reset the user password if ($user->attemptResetPassword('8f1Z7wA4uVt7VemBpGSfaoI9mcjdEwtK8elCnQOb', 'new_password')) { // Password reset passed } else { // Password reset failed } } else { // The provided password reset code is Invalid } } catch (Cartalyst\Sentry\Users\UserNotFoundException $e) { echo 'User was not found.'; }
check
ve attempt fonksiyonlarıyla önce password kodunun doğru olup olmadığını
kontrol edip, ardından new_password değerini bir formdan gelen yeni
şifreyle doldurup kullanabilirsiniz.
Üyelik
grupları, suspend vs gibi ayarlar da yine benzer şekilde
ayarlanabiliyor. Eğer bir kullanıcıyı engellemek isterseniz
yukarıdakilere benzer bir kullanımla yapabilirsiniz.
Gereksiz bilgi:
Suspend hesabı askıya almak, ban yasaklamaktadır hatırlatıyım bu arada ☺ İkisi de mantık olarak aynıdır ama ban kurallara uymayan kullanıcılara, suspend ödeme vs gibi işlemleri yapmayanlara kullandığımız bir sistemdir. Yani bir kullanıcı ödemesini yapmadı diye banlamayın ☺
Suspend hesabı askıya almak, ban yasaklamaktadır hatırlatıyım bu arada ☺ İkisi de mantık olarak aynıdır ama ban kurallara uymayan kullanıcılara, suspend ödeme vs gibi işlemleri yapmayanlara kullandığımız bir sistemdir. Yani bir kullanıcı ödemesini yapmadı diye banlamayın ☺
Yine
benzer bir şekilde Login User Attempt dediğimiz şifre girişi sayısı,
hatalı giriş sayısı gibi özellikleri kullanabilirsiniz.
Bunu
da örnek olarak istemediğiniz bir sorguyu fazla yapan kullanıcıları
yada belirli bir indirme limiti olan kullanımlar da limit attempt
yaparak kullanabilirsiniz.
IP engelleme gibi özellikleri SQL de throttle tablosu var oradaki bilgileri de kullanarak yapabilirsiniz.
Group ve İzinler konusunda da kısa bir bilgi vermek gerekirse;
Örnek olarak Beyazıt kullanıcısını 2 farklı şekilde izin verebilirsiniz.
Birincisi
kullanıcıya özel izinler, bir diğeri herhangi bir kullanıcı grubuna
alıp izin vermek gibi. Yani eğer isterseniz tek bir kullanıcıya özel bir
izin verebilirsiniz yada birden fazla kullanıcıya benzer izinleri
vermek için Admin,Moderatör gibi izinleri kullanabilirsiniz.
Son olarak route ile bazı sayfalara girişleri vs yasaklayalım..
Bunun için Router::filter ile rotalarımıza ufak bir filtreleme yapalım.
Route::filter(‘uyemi’,function(){ if(!Sentry::check()){ return Redirect::to(‘/’); } });
Uyemi
filtremiz sentry::check ile login olup olmadığını kontrol ediyor.Eğer
üye değilse anasayfaya geri gönderiyor. Unutmadan bunu filters.php de
yapıyoruz.
Peki bunu nasıl kullanıcaz?
Route::before özelliğiyle rotaya gitmeden bir kontrolden geçirelim hemen. Routes.php de;
Route::post(‘yazi/yazi-ekle, array(‘before’ => ‘uyemi’,’as’ => ‘yazikaydet’, ‘uses’ => ‘YaziControler@yazikaydet’));
Yukarıda yazı eklemeden önce bir üyelik girişi şartı koştuk.
Yine
benzer bir şekilde üye girişi sayfasını üyelere yasaklamak istiyoruz
yukarıdaki filter fonksiyonunu da çok ufak bir değişiklik yapıp
Route::filter(‘uyebuzaten’,function(){ if(Sentry::check()){ return Redirect::to(‘/’); } });
diyerek eklediğimiz de
Route::post(‘giris array(‘before’ => ‘uyezatenbu’,’as’ => ‘giris’, ‘uses’ => ‘UserController@giris’));
bu sefer de giriş olan kullanıcılara kapatabilirsiniz.
Genel olarak Laravelin normal kullanıcı işlemlerinden daha çok sevdiğim bir paket olduğundan paylaşmak istedim.
Saygılarımla.
Comments
Post a Comment