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 ☺
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

Popular posts from this blog

Laravel Datatable