Makale Özeti

Bu makale COM+ üzerinde temel düzeyde çalışma yapmış ve COM+ın sunduğu rol tabanlı güvenlik özelliklerini öğrenmeyi amaçlayan okuyucuları hedef almaktadır. Bu anlamda COM+ hakkındaki temel bilgiler ön koşul niteliği taşımaktadır.

Makale

Uyarı : Bu makale COM+ üzerinde temel düzeyde çalışma yapmış ve COM+ın sunduğu rol tabanlı güvenlik özelliklerini öğrenmeyi amaçlayan okuyucuları hedef almaktadır. Bu anlamda COM+ hakkındaki temel bilgiler ön koşul niteliği taşımaktadır.

Çok kullanıcılı ortamlarda çalışan kurumsal uygulamalar için güvenlik vazgeçilemez bir özelliktir. Yazılım terminolojisinde güvenlik; çok farklı anlamlara gelebilen, genel bir kavram olmakla birlikte, COM+ özelinde, “bileşen kullanımının roller bazında kontrol edilmesi” biçiminde anlaşılmalıdır.

Bu kavramı basit bir örnek üzerinden giderek anlatmaya çalışalım. Bildiğiniz gibi bankalarda çalışan müdür ve şeflere, konumları itibari ile diğer memurlara göre daha fazla insiyatif kullanma hakkı tanınır. Örneğin sıradan bir memurun, müşteriye ekstra faiz puanı verme hakkı bulunmazken, şef ya da müdürlere, uygun görülen müşteriler için, ekstra faiz puanı verme hakkı tanınır. Buradaki şef ve müdür ünvanı; özel bir rol ifade etmektedir. Bir başka deyişle, bu rollerden herhangi birisine sahip olan bir banka çalışanı (kimliği ne olursa olsun) kendisi ile ilgili role tanınan haklarla, donatılmış durumdadır.

Örnek uygulamada bu ekstra puan değeri; şefler için (+2), müdürler için ise (+3) olarak öngörülmüştür. Belirlenen faiz oranına, ekstra puan verme işlemi; COM+ servislerinden faydalanabilme yeteneğine sahip, Banka sınıfının bir üyesi olan, EkstraPuan() isimli bir fonksiyonun çağrılması ile gerçekleşmektedir. EkstraPuan() fonksiyonunun implementasyonu son derece basit olmakla birlikte, herhangi bir t anında fonksiyonun kim tarafından çağrıldığı, ve bu kişinin hangi role ait olduğunun belirlenmesi, çözüm bekleyen en ciddi sorundur. Bu sorunun çözümü; öncelikle çalışanların, müdür, şef ve diğer rollere göre kategorize edilmesini gerektirir. Buradaki iş süreçleri;

1. Rollerin tanımlanması.
2. Sistemde çalışan kullanıcıların (tek tek ya da gruplar düzeyinde) tanımlanan roller ile ilişkilendirilmesi. biçiminde listelenebilir.

Sayılan tüm bu işlemler, COM+ ‘ın sunduğu rol tabanlı güvenlik özellikleri sayesinde kolaylıkla gerçekleştirilebilir. Çünkü COM+ ‘a ilişkin bu özellikler, işletim sisteminin güvenlik altyapısına entegre edilmiş durumdadır. Bu bağlamda belirlenen roller, sistem üzerinde tanımlı kullanıcılara atanabilir. Ancak şu ana kadar anlatılanlar, rollerin belirlenmesi ve sistemdeki kullanıcılarla ilişkilendirilmesi gibi sadece yönetsel düzeydeki işlemleri kapsamaktadır.

Öte yandan herhangi bir t anında fonksiyonu çağıran kullanıcının hangi role ait olduğunun belirlenmesi gibi programatik işlemlerin de yapılması gerekir. COM+ ‘ın sunduğu rol tabanlı güvenlik özellikleri ile uygulama tarafındaki bileşenin entegrasyonu; System.EnterpriseServices namespace ‘i içerisindeki SecurityCallContext isimli sınıfın kullanımı ile gerçekleştirilir. Bu sınıfın pratikte en çok kullanılan üyesi; aynı sınıf türündeki CurrentCall isimli statik property’dir. Bu property’nin içerdiği; SecurityCallContext sınıfı türündeki referans değeri; bileşeni o an kullanmakta olan çağırıcıyı temsil eder. Uyarı : Buradaki çağırıcı, caller kelimesinin karşılığı olarak kullanılmıştır.

Örnek :

Aşağıdaki “class library” örneği, şu ana kadar modellemeye çalıştığımız yapının uygulamasıdır. EkstraPuan() isimli fonksiyon incelendiğinde, parametresine geçirilen faiz oranına, fonksiyonu çağıran kullanıcının rolüne göre farklı değerlerin eklendiği ve sonuçta elde edilen yeni faiz oranının döndürüldüğü görülmektedir. Fonksiyonu çağıran kullanıcının hangi rolle ilişkili olduğunun anlaşılması ise; fonksiyon içerisinde kullanılan karar mekanizmaları sayesinde olmaktadır.

SecurityCallContext.CurrentCall.IsCallerInRole("Sef")

Yukarıda görülen kod satırı, EkstraPuan isimli fonksiyondan alınmıştır. Bildiğiniz gibi CurrentCall property’sinin içerdiği referans; ilgili fonksiyonu çağıran kullanıcıyı temsil eder. IsCallerInRole() metodu ise; söz konusu kullanıcının, belirlenen bir rolün üyesi olup olmadığının anlaşılması amacı ile kullanılır.

Public Function IsCallerInRole(ByVal role As String) As Boolean

IsCallerInRole() fonksiyonunun true değerini döndürmesi ile; söz konusu kullanıcının belirlenen rolün üyesi olduğu anlaşılır.

Public Class Banka
    
Inherits ServicedComponent
     Public Function EkstraPuan(ByVal faiz_orani As Integer) As Integer
          If (SecurityCallContext.CurrentCall. IsCallerInRole("Sef")) Then
               Return (faiz_orani=faiz_orani+2)
          ElseIf (SecurityCallContext.CurrentCall. IsCallerInRole("Mudur")) Then
               Return (faiz_orani=faiz_orani+3)
          Else
               Return (faiz_orani)
          End If 
     End Function
End Class

Bu uygulamayı derleyip COM+ ‘a ekledikten sonra, Component Services yönetim pencerelerini kullanarak, rollerin tanımlanması işlemine başlayabilirsiniz. Bunun için Roles simgesi üzerinde sağ tıklamak ve açılan menüden New > Role öğesini seçmek gerekir. Bu işlem sonucunda açılan Role başlıklı diyalog penceresi kullanılarak, rol tanımları gerçekleştirilir. Örnek uygulama için, Mudur ve Sef olarak, iki rol tanımının yapılması yeterlidir.

Şekil : Rol tanımlaması

Rollerin tanımlanmasının ardından yapılması gereken işlem; rollerin sistemdeki kullanıcılarla ilişkilendirilmesidir. Component Services penceresinin sol tarafında her bir rolü temsil eden simge altında, bu rolle ilişkilendirilmiş kullanıcıları gösteren Users isimli bir simge bulunur. İlişkilendirme işlemi için, Users simgesi üzerinde sağ tıklanarak, açılan menülerden New > User öğesini seçmek gerekir. Bu işlem sonucunda açılan “Select Users or Groups” başlıklı diyalog penceresi kullanılarak, kullanıcı ya da grupların rollerle ilişkilendirilmeleri sağlanır.

Şekil : Kullanıcı ya da grupların rollerle ilişkilendirilmeleri

Dikkat : Çalıştığım VANCOUVER isimli sistemde, Aykut ve Zeren isminde iki kullanıcı bulunmaktadır. Aykut isimli kullanıcıyı Mudur rolü ile, Zeren isimli kullanıcıyı da Sef rolü ile ilişkilendirdim. Son olarak yapılması gereken işlem; sınıfla ilgili güvenlik özelliklerinin aşağıdaki şekilde gösterildiği biçimde ayarlanmasıdır.

Bu işlemlerin tamamlanılmasının ardından, test amacı ile kullanılacak olan istemci uygulamanın tasarımına başlanılabilir. BankSample isimli bileşeni ve System.EnterpriceServices.dll ‘i referanse eden herhangi bir uygulama türünü, test amacı ile kullanmak mümkündür. Çünkü bu örnekte hedeflenen olgu; bileşenin farklı rollere sahip kullanıcılar için, farklı davranış gösterebilme yeteneğinin sınanmasıdır.

Private Sub Form1_Load()
    Dim obj As New Banka
    MsgBox(obj.EkstraPuan(26).ToString())
End Sub

Uygulama, farklı kullanıcı oturumları açılarak, çalıştırıldığında ekrana farklı değerlerin yazıldığı gözlemlenecektir.

Aykut TAŞDELEN

aykuttasdelen@yazgelistir.com