emrekilinc1984 yazdı:Merhaba arkadaşlar,
Ben aşağıdaki kodla yetki vermeye çalışıyorum acaba bu kod uygunmudur yetkilendirme için ve if tarafına ne yazmalıyım yardımcı olur musunuz.
Kod: Tümünü seç
var
user_id:String; // <--- [1][2]
sonuc,mesaj:integer; // <--- [6]
begin
user_id:=statusbar1.Panels[0].Text; // <--- [8]
with ado do // <--- [3]
begin
Close;
SQL.Clear;
SQL.Add('select b.id, y.id from bt_kullanici b, yetki_tablosu y where b.id ='); // <--- [7]
SQL.Add(+QuotedStr(user_id)+'and y.bilgi_islem=''1'''); // <--- [4][5]
Open;
sonuc:=RecordCount;
deger.Caption:=IntToStr(sonuc);
//burada if bilgi_islemi 1 ise giriş yapsın istiyorum
Merhaba,
Öncelikle Delphi ile programlama konusunda bazı temel noktalara dikkat etmenizde fayda var.
[1] - Değişken isimleri her ne kadar kullanıcı tasarrufunda olsa da Pascal için kabul görmüş kelimelerin ilk harfi büyük şeklinde yazmanızda fayda var
[2] - Program kodu yazarken az çok her dil için geçerli olan yazılı olmayan diğer bir kural ise "blok" olarak tabir edilen Delphi'de begin..end, try..finally, try..except gibi ifadelerin arasında kalan kodları birkaç karakter içeriden yazmak gerekir. Sizin yukarıda "Close" ifadesinden sonraki kodunuz aynı seviyede olmasına rağmen merdiven gibi her bir satırda biraz daha içeriden yazılmış.
[3] - Her ne kadar kod yazmayı kolaylaştırıyor olsa da "with" kullanımından kaçınmanızda fayda var. Hiç ummadık bir yerde başınıza dert açma ihtimali vardır.
[8] - StatusBar1.Panels[0].Text kendi başına string bir değişkendir. Bunun için yeni değişken tanımlamanıza gerek yok.
Gönderdiğiniz kod ile ilgili olarak SQL için hata alma ihtimaliniz var.
[4] - SQL içindeki "and" ifadesi başında hiç boşluk bırakmamışsınız. MS-SQL server bu tarz bir SQL'i algılayıp çalıştırabilir. Denemek gerekli. Ancak SQL kodu olarak çok doğru değildir.
[5] - Sürekli aynı sorguyu çalıştıracak iseniz, Bir ADOQuery nesnesini Form / DataModule üzerine ekleyip. SQL bilgilerini parametrik olarak ayarlayıp kullanmanız daha pratik olacaktır. QuotedStr() gibi fonksiyonları kullanmanıza gerek kalmaz ve yazdığınız kodun okunuluğu artar.
[6] - "mesaj" adındaki değişkeniniz gönderdiğiniz kod içinde kullanılmıyor. Eğer bize prosedür/fonksiyonun tamamını göndermedi iseniz ve görmediğimiz kısımda kullanılıyor ise bu uyarıyı gözardı edebilirsiniz. Bu noktada Delphi size yardımcı olmak için ekranın altındaki "Messages" bölümünde [Warning] veya [Hint] şeklinde bu konuda size uyarıda bulunur. Böyle boş ve kullanılmayan değişkenleri silmenizde fayda vardır.
[7] - SQL sorgusunda kullanmayacağınız alanları listelemek yerine sadece işinize yarayacak alanları almanız daha doğru olacaktır. Siz sorgunuzda özetle ilgili ID için kayıt var mı kontrolü yapıyorsunuz. Bu anlamda "Count(y.id)" gibi bir ifade sizin daha çok işinize yarayacaktır.
Yapmak istediğiniz yetkilendirme ile ilgili olarak. Öncelikle yetkilendirme seviyenizi belirlemeniz ve buna göre işe başlamanızda fayda var.
A- Sadece uygulamaya giriş için mi şifre sorulacak?
B- Uygulama içinde farklı formlar açılırken yetki sınırlaması olacak mı?
C- Formlar içinde alanların (grid veya edit) görülmesi için yetki sınırlaması olacak mı?
D- Formlar içinde bilgi girişlerini yapma/değiştirme/silme noktasında yetki sınırlaması olacak mı?
E- Formlar içindeki verilerin içe/dışa aktarılması noktasında yetki sınırlaması olacak mı?
F- Formlar içindeki verilerin yazdırılması/raporlanması noktasında yetki sınırlaması olacak mı?
G- Kullanıcıların Yetki tanımlarını ekleme/değiştirme/silme gibi bir yetkilendirme olacak mı?
Yukarıdaki listeyi uzatmak mümkün. Bu listedeki her madde yetki tablonuzda bir alan ve yetki tablonuzun birden fazla olması anlamına gelecektir. Diğer taraftan uygulama içinde birçok noktada ek kontroller eklemeniz anlamına da gelecektir. Dolayısı ile uygulamanın belli bir aşamasını bitirdikten sonra bir madde daha eklemek isterseniz yazdığınız tüm kodu yeniden tarayarak eklenmesi gereken kod bloklarını eklemek gibi yeni bir iş daha çıkar karşınıza.
Yani sizin ilk başta sorduğunuz soru başlı başına detaylı bir konudur aslında.
Gönderdiğiniz kodun olası düzenlenmiş hali şöyle olabilir:
Aşağıdaki fonksiyonu formunuza tanımlayın. Tercihen tüm formların kullandığı bir UNIT oluşturup bunun içine tanımlamanızda fayda var.
Kod: Tümünü seç
function TForm1.Yetkili(ID: string): Boolean;
var
Query: TADOQuery;
begin
Query := TADOQuery.Create(nil);
try
Query.Connection := Module.Connection; // Burası projeye göre düzenlenmeli
Query.SQL.Add('select Count(y.id) from bt_kullanici b, yetki_tablosu y');
Query.SQL.Add('where b.id = ' + QuotedStr(ID) + ' and y.bilgi_islem = ' + QuotedStr('1'));
try
Query.Open();
Result := Query.Fields[0].AsInteger > 0;
except
Exit(False);
end;
finally
Query.Free();
end;
end;
Daha sonra yetki kontrolü için aşağıdaki gibi bir kod yazabilirsiniz.
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
begin
if Yetkili(StatusBar1.Panels[0].Text) then
ShowMessage('Hoşgeldiniz.')
else
ShowMessage('Yetkiniz yok!');
end;