PHP Kullanıcıları Yetkiendirmek(Çözebilen var mı?)

Kodla Büyü

yazilimuzmani

Site Gezgini
Mesajlar
60
Arkadaşlar merhaba ben siteme kullanıcı yetkilendirmesi yapmak istiyorum, yalnız yetkilendirme işi tamamen dinamik bir yapıca olacak. Örneğin;
Kod:
if($mysql_gelen_uyenin_yetkisi=='yonetici')
{
echo "Bu sayfayı görebilirsiniz...";
}
else
{
echo "Bu sayfayı göremek için yetkiniz yok.";
}

gibi kod tarafında bu kontrol yaptırmak istemiyorum. Çünkü yönetici haklarına sahip olan bir kişi site üzerinden Yetki adlarını dinamik olarak değiştirebilecek. Yani diyelim yönetici hakkına sahip olan kişi; "yonetici" adlı yetki adını kodlanmış site üzerinden "admin" olarak değiştirdi ve bu bilgi veritabanına kayıt edildi. Eğer üstteki gibi bir kod yazarsak, artık yonetici rolüne sahip olan bir üye bile yetki adı artık "yonetici" değilde "admin" olarak ismi değiştirildiği için; "Bu sayfayı göremek için yetkiniz yok." yazısı ile karşılaşacak.

Ama ben istiyorum ki, mysql veritabanında "sayfalar" adında bir tablom bulunsun ve her sayfa için ayrı yetkilere ayrı izinler verilsin mesela okuma,yazma,silme,görüntüleme izinleri. Mesela "a" adındaki bir sayfayı sadece yonetici yetkisine sahip olanlar görebilsin ancak diğer üyeler göremesin. Aynı şekilde "b" adındaki bir sayfayı sadece "moderator" ve "yonetici" yetkilerine sahip olanlar görebilsin ve değiştirebilsin fakat "uye" yetkisine sahip bir kişi "b" sayfasını sadece görebilsin yani değiştiremesin. vs...

Veritabanından yetki_id çeksem if ile kontrol yazsam, yonetici site üzerinden bir yetki sildi ne olacak?
Veritabanından yetki_ad 'ını çeksem if ile kontrol yaptırsam, bu seferde yonetici site üzerinden diyelim bir yetkinin adını değiştirdi ne olacak?

Arkadaşlar durum çok karmaşık yani bir türlü; içinden çıkamadım. Fikirlerinizi almak istedim.
 
if($mysql_gelen_uyenin_yetkisi=='yonetici') böyle bir sınama zaten çok mantıklı olmaz hocam onun yerine kullanıclara sayısal değerle yetkilendir. mesela yonetici=1 üye=2 gibi
 
hocam bahsettiğin işlemin nasıl olması gerektiğini küçük bir örnek üzerinde adım adım anlatmaya çalışayım.

3 tane tablomuz olsun.
uyeler(id,adi,soyadi,eposta,meslek)
haber(id,baslik,icerik,tarih)
kullanicilar (id,kadi,sifre,haberyetki1,haberyetki2,haberyetki3,haberyetki4,haberyetki5,uyeleryetki1,uyeleryetki2,uyeleryetki3,uyeleryetki4,uyeleryetki5)

kullanıcılar tablosunda her tablo için 5 alan oluşturdum. bunlar sırasıyla o tablo için, görüntüleme,ekleme,silme,düzeltme ve onaylama işlemleri için
mesela haberler tablosunun listesini görebilmesi için bu kullanıcının haberyetki1 alanı değeri 1 olması gerekecek, görememesi içinde 0 olması gerekecek.

simdi bir fonksiyon oluşturacağız aktif kullanıcının belirleyeceğimiz tablo üzerinde yetkisi olup olmadığını sorgulamak için

function yetkikontrolet($kullanici,$tablo,$durum) {
$oku=@mysql_query("select * from kullanicilar where kadi='$kullanici'");
$say=@mysql_num_rows($oku);
if ($say>0){
$satir=@mysql_fetch_array($oku);
$alan=$tablo.$durum;
$deger=$satir[$alan];
return $deger;
}
}

mesela haber ekleme formu için aşağıdaki gibi fonksiyonu kullanabilirsiniz.
$kullanici =$_SESSION["kullaniciadimiz"]; // session değişkeninden kullanici adını alıyoruz
$izindurum=yetkikontrolet($kullanici,"haberyetki","2");
if ($izindurum==0)
{
include"izinyok.php";
}
else
{
// .....
// haber ekleme formu kodları
}

yönetim panelinde de her kullanıcı için checkbox kullanarak yetki durumlarını (haberyetki1,haberyetki2, ) gibi veritabanına 1 yada 0 olacak şekilde update işlemi yaptırabilirsiniz.

umarım faydalı olur. kolay gelsin.
 
mustafa hocam -> Sayısal değerlerle çalışırsamda, id sini kodlarla kontrol ettiğim yetki, diyelim veritabanından silindi ne olacak ID kullanılmasıda pek güvenli değil yani.

phpcoder hocam -> Ben her sayfa için, her yetkiye ayrı izinler vermek istiyorum hocam. Siz veritabanındaki sayfaya bütün üyeleri kapsayan izinler vermişsiniz. Mesela "Makaleler" sayfasını sadece yonetici yetkisine sahip olan kullanıcılar düzenleyebilsin fakat yine aynı sayfayı diğer tüm üyeler sadece görebilsin istiyorum. Yani işin kısacası;

Veritabanındaki yetkiler tablosundaki her yetki için, sayfalar tablosunda ayrı yetki izinleri olabilir mi?
 
Birde izin sınamasını sadece sayfa include edildikten önce değil veritabanına işlem yapmadan öncede sınamalısınız yoksa sistemin açığı olur :)))
 
phpcoder hocam kusuruma bakmayın bu konunun üzerinde çok durduğumdan dalgınlığıma gelmiş hem sizden özür diliyor hemde teşekkür ediyorum.
faky18 hocam önerilerinizi değerlendireceğim teşekkür ederim.
 
Yetkilendirme icin ayri ayri alanlar kullanmak yerine hepsini ikilik sayi sistemi mantigi ile tek bir alana kayit edebilirsin. 5tane haber icin 5 tanede uyelik yetkileri icin
1000011011 gibi
 
hocami ftp dosya ve klasör yazma izinleri hakkında bilgin var mı ona benzer mantık,
ama açıklama istersen,
(admin) (yonetici) (uye) gibi 3 basit yapıyı şöyle kullanabilirsin,
1 0 0 ikilik taban=4 onluk taban (veri tabanında kayıt edilecek sayı) bu kişi admin yetkili olur.
0 1 0 ikilik taban=2 onluk taban (veri tabanında kayıt edilecek sayı) bu kişi yonetici yetkili olur.

yetkileri okurken de veritabanından mesela 4 aldın, bu kişi admin mi sorusuna cevap bulmak için bu sayıyı 4 sayısı ile AND işlemine tabi tutacaksın sonuç 1 ise admin olmuş olur.
 
hocam senin kafan karışmış biraz
önce vt ni tasarla uyeler tablosunda sadece uyetip şeklinde sayısal tipler tanımla
0 admin
1 moderator
2 ziyaretci
gibi sonra sesion la yaptığımız kullanıcı girişini yaptırırken zaten bu kullanıcı bilgisi vt de var mı diye sorgulama yapmalısın o sırada uyetip bilgisini de çekip ilgili kısıtlamaları yapabilirsin.Doğru anladıysam bunun gibi çözümler düşünülebilir.
Yönetici yetki tipini değiştirsin sadece sayısal değeri ona göre güncelleyecek yetki adına gelince bunu zaten textbox dan değiştirmesi saçma sapan olur oraya
combobox tam oturur.combobox vt den tanımlı yetki isimlerini çeker selectedvalue değeri de yine 0,1,2 gibi sayısal olur.
Basit düşün kafanı karıştırma kolay gelsin
 
makron' Alıntı:
hocam senin kafan karışmış biraz
önce vt ni tasarla uyeler tablosunda sadece uyetip şeklinde sayısal tipler tanımla
0 admin
1 moderator
2 ziyaretci
gibi sonra sesion la yaptığımız kullanıcı girişini yaptırırken zaten bu kullanıcı bilgisi vt de var mı diye sorgulama yapmalısın o sırada uyetip bilgisini de çekip ilgili kısıtlamaları yapabilirsin.Doğru anladıysam bunun gibi çözümler düşünülebilir.
Yönetici yetki tipini değiştirsin sadece sayısal değeri ona göre güncelleyecek yetki adına gelince bunu zaten textbox dan değiştirmesi saçma sapan olur oraya
combobox tam oturur.combobox vt den tanımlı yetki isimlerini çeker selectedvalue değeri de yine 0,1,2 gibi sayısal olur.
Basit düşün kafanı karıştırma kolay gelsin
evet doğru söylüyorsun yönetici işlemleri için bu daha kolay olur, çünkü bir yönetici hem admin, hemde moderatör olamaz,
ama haber ekleme, çıkarma, silme, uye ekleme, silme işlemleri için 1 den fazla yetkiyi vermek sorun olur.
bunun çözümü de bence benim anlattığım gibi daha basit olur.
 
Arkadaşlar benim kafamı karıştıran; menü elemanlarını(ul ve li taglarını kullanarak) dinamiklik katmak için, veritabanından çekiyorum "sayfalar" tablosunda ayrıca menulerde var.( Verileri çekerken; Select * from sayfalar where menu=1 diye çekiyorum) Ancak üye girişi yapılmadığı zaman üyelere özel menü elemanlarını, göstermek istemiyorum ayrıca kullanıcı eğer üye olmadan yukarıdaki adres çubuğunada adresi yazmışsa sayfayı görmesini engellemek istiyorum. Bunun yanında; üye giriş yapmışsa bir ortak menüler olacak(bütün yetkiler tarafından görülebilen) bir de yetkiye özel menüler olacak.

Örneğin üye giriş yapmamışsa menü;

Anasayfa
Bilişim Faaliyetleri -> PHP, ASP.NET, CSharp
Kayıt Ol
İletişim -> Adres & Telefon, İnternet üzerinden iletişim.



Normal bir üye giriş yapmışsa menü;

Anasayfa
Bilişim Faaliyetleri -> PHP, ASP.NET, CSharp
Üye İşlemleri -> Profilimi Düzenle, Mesajlarım
İletişim -> Adres & Telefon, İnternet üzerinden iletişim.


Yönetici yetkisine sahip bir üye giriş yapmışsa menü;

Anasayfa
Bilişim Faaliyetleri -> PHP, ASP.NET, CSharp
Üye İşlemleri -> Profilimi Düzenle, Mesajlarım, Sayfaları Düzenle, Üyeleri Görüntüle
İletişim -> Adres & Telefon, İnternet üzerinden iletişim.

Gördüğünüz gibi; üye girişi yapmış kişilerin "Üye işlemleri" ne ait alt menülerde "Profilimi Düzenle" ve "Mesajlarım ortak" fakat "Sayfaları Düzenle" ve "Üyeleri Görüntüle" adlı alt menülerini sadece yönetici görebiliyor ve girmesine izin veriliyor. Bunu nasıl yapabilirim?
 
Arkadaşlar karmaşık diye söylemiştim size... :)
Peki en azından bir fikir verebilecek olan hocalarım var mı?
Bu dediklerimin birçok sitede örneğine rastlamak mümkün fakat bu insanlar bunu yapmayı nasıl başarıyorlar?
 
eğer istediğin sadece kullanıcıya göre farklı menülerin görünmesi ise şöyle yaparsın.
Kod:
Anasayfa
Bilişim Faaliyetleri -> PHP, ASP.NET, CSharp
<?php
if ($user=="") { echo ("kayıt olt");}
elseif ($user=="uye") {echo ("üye işlemleri, profil mesaj"); }
else if ($user=="admin") {echo ("üye işlemleri, profil mesaj sayfalar üyeler"); }
else echo ("hata");
?>
İletişim -> Adres & Telefon, İnternet üzerinden iletişim.
en basit şekliyle bu şekilde olur. tabikide kullanıcı girişini önceki satırlarda kontrol etmen gerek.

ama işin içine yorum ekleme silem üyelik onaylama mantığını da katarsan, o zaman bu yapı seni kurtarmaz.
her bir işleme modül olarak bakarsak (üyelik işlemleri, mesaj işlemleri v.b.) yetki gerektiren her modüle tek tek kontrol yazmak yerine bir tane session kontrolü yazıp hepsinin ilk satırına include edersin, sonuca göre modüle girişe izin verirsin yada vermezsin.
yani senin istediğin yapı sadece 1 sayfada kontrol ile yapılabilecek bişey değil eğer doğru anladıysam.
 
arkadaşlar
benimde buna ihtiyacım var.çalışmayı benim le paylaşabilirmsiniz
 
hocam yetkiler diye bir tablo oluştur kullanıcıların yetkilerinide kullanıcı tablosunda yetki id olarak sakla kullanıcılar tablosunda bir alan daha oluşturup yetki adi ismini ver kullanıcı sadece bu yetki adi alanını değiştirsin ama sen kontrolü yaparken yetki id ye göre yap
 
yetki id ye göre yapılmalıdır. hocamlarımın bahsettiği gibi rakamsal ifadeler koşulda kullanılmalı.
 
<?php

session_start();
if(isset($_SESSION["yetki"]))
{
//üye giriş yapmamışsa menü;
}
else{
if($_SESSION["yetki"]==1)
{
//Yönetici yetkisine sahip bir üye giriş yapmışsa menü;
}
else
{
//Normal bir üye giriş yapmışsa menü;
}
}
 
Geri
Üst