Aynı anda farklı cihazlardan oturum açmayı engelleme
yapmış olduğum bir projede siteye aynı anda farklı cihazdan girişin engellenmesi isteniyor site paylaşımımı hostingde olduğu için nod js kullanamıyorum bu konu hakkında fikirlerinizi bekliyorum teşekkür ler
Üye girişi yapan kullanıcının giriş bilgilerini çerezlerde ve aynı zamanda veritabanında saklayarak istediğin işlem yapılabilir. Aşağıda örneğini verdiğim sistem üye formlarında bulunan "Beni Hatırla" seçeneği için de kullanılabilir.
Örnek
2 adet tablomuz olsun;
- users (Kullanıcı bilgilerinin saklandığı)
- remember_token (Kullanıcının giriş bilgilerinin saklandığı)
Kullanıcı bilgilerini veritabanına kayıt etme ve çerez oluşturma
Kullanıcı users tablosundaki username, password değerleri ile giriş yaptığı zaman kullanıcı için çerez oluşturalım. Oluşturacağımız çerezin içerisinde sadece token bilgisi yer alacak.
Oluşturacağımız çerezi önce veritabanına kayıt ediyoruz. Kayıt ettikten sonra çerez oluşturma işlemini gerçekleştiriyoruz. Veritabanı işlemleri için düz PDO yerine BasicDB sınıfını kullandım.
/*
* 32 Karakter uzunluğunda rastgele token oluşturuyoruz.
*/
$token = bin2hex(random_bytes(32));
/*
* Oluşturacağımız çerezin oluşturulduğu tarihten itibaren +7 gün geçerli olmasını sağlıyoruz.
*/
$time = time() + 604800;
/*
* Giriş yapan kullanıcının tarayıcı ve IP bilgisi
*/
$useragent = $_SERVER['HTTP_USER_AGENT'];
$ip = $_SERVER['REMOTE_ADDR'];
$insert = $db->insert('remember_token')
->set(array(
'user' => $buraya_user_id, # Giriş yapan kullanıcını users tablosunda bulunan id değeri
'token' => $token, # Çerezi oluşturmak için kullandığımız token
'ip' => $ip,
'useragent' => $useragent,
'time' => $time
));
if($insert){
/*
*
* Çerezi Oluşturuyoruz
*
* 1. Parametre: Anahtar
* 2. Parametre: Değer
* 3. Parametre: Çerezin ne kadar süreyle geçerli olacağını belirler.
* 4. Parametre: Çerezin hangi URL yolları altında erişilebilir olduğunu belirler.
*
*/
setcookie("Auth", $token, $time, '/');
}
Oluşturulan bilgilerin kontrol edilmesi
Oluşturduğumuz çerezi şimdi kontrol ettirmemiz gerekiyor. Kullanıcı girişi sırasında eğer kullanıcının bilgileri doğru ise "remember_token" tablosunda kullanıcıya ait bir veri olup olmadığını kontrol etmemiz gerek. Eğer "remember_token" tablosunda kullanıcıya ait bir veri var ise kullanıcı girişini yapmasını engelleyeceğiz.
$query = $db->from('remember_token')
->where('user', $buraya_user_id)
->first();
if($query):
die("Aktif oturumunuz bulunduğu için girişiniz engellendi");
else:
# Giriş işlemine devam
endif;
Kullanıcı oturumunu kontrol etme
Şimdi yaptığımız sistemde kullanıcının giriş yaptığını sisteme bildirmiş olduk ve kullanıcının aktif oturumu var ise giriş yapmasını engellemiş olduk. Şimdi ise kullanıcının giriş yaptığı tarayıcıda oluşturduğumuz çerezi veritabanına kontrol etmemiz ve çerezdeki bilgiler veritabanında mevcut ise oturumuna devam etmesini sağlamamız gerekiyor.
Aşağıdaki kontrol kodlarını projenizin sürekli çağırılan bir dosyasına entegre edebilirsiniz veya kullanıcı oturumlarını belirli aralıklarla kontrol edilmesini sağlayabilirsiniz.
if(isset($_COOKIE['Auth'])){
# Oluşturduğumuz çerezi kontrol ediyoruz, eğer mevcut ise işlemlere devam.
$Cookie = $_COOKIE['Auth']; # Çerezi değişkene aktarıyoruz
$query = $db->from('remember_token')
->where('token', $Cookie)
->first();
if ($query) {
# Token eğer veritabanında mevcut ise süresini kontrol ediyoruz
if(time() > $query['time']){
# Mevcut tarih eğer veritabanında bulunan tarihten büyük ise veritabanındaki tokeni siliyoruz
$delete = $db->delete('remember_token')->where('token', $Cookie)->done();
# Daha sonrasında çerezi de silmemiz gerekiyor.
setcookie('Auth', '');
# Burada kullanıcı session kontrolleri yapılabilir.
# Eğer session mevcut ise kaldırılabilir.
}else{
# Burada kullanıcı sessionları kontrol edilir.
# Session mevcut değil ise kullanıcının girişi için sessionlar oluşturulur.
}
} else {
# Token eğer veritabanında mevcut değil ise user id ile sorgulama yapıyoruz.
# Eğer veritabanında veri var ise sileceğiz, eğer oluşturduğumuz çerez yok ise
# kullanım süresi dolmuş demektir.
$user = $db->from('remember_token')->where('user', $buraya_user_id)->first();
if($user){
# Eğer veritabanında user id ile eşleşen veri bulunduysa siliyoruz.
$delete = $db->delete('remember_token')->where('user', $buraya_user_id)->done();
}
}
} else {
# Eğer çerez tarayıcıda bulunmuyor ise yapılacak işlemler.
echo "Auth çerezi bulunmuyor.";
}
Yukarıdaki kontrol kodlarında ayrıca tarayıcı bilgilerini, ip adresini vb. bilgileri kontrol ettirerek detaylandırabilirsiniz.
Aklıma bu şekilde bir çözüm geldi umarım yanlış bir mantık kurmamışımdır :D Ancak bu sistem biraz daha detaylandırılırsa birden fazla oturumun yönetimi için de kullanılabilir diye düşünüyorum.