Birden izin türlerini işlemek için en iyi yolu nedir?

oy
17

Sık sık izinler birçok farklı türde sunmak gerekiyor Aşağıdaki senaryoyu karşılaşıyoruz. Ben öncelikle SQL Server 2000 ile ASP.NET / VB.NET kullanın.

senaryo

Ben farklı parametreler üzerinde çalışabileceği bir dinamik izin sistemini sunmak istiyoruz. ı bir departman veya uygulamaya sadece belirli bir kişiye erişim ya vermek istiyorum diyelim. Ve Büyümeye devam uygulamaları bir dizi varmış gibi rol.

Geçmişte, bunu yapmak için biliyorum aşağıdaki iki yoldan birini tercih etti.

1) nasıl parametreleri uygulamak için belirlemek için kullanılan özel sütunlarla tek izin tabloyu kullanın. Bu örnekteki özel sütunlar TypeId ve TypeAuxID vardır. SQL böyle bir şey olmazdı.

SELECT COUNT(PermissionID)
FROM application_permissions
WHERE
(TypeID = 1 AND TypeAuxID = @UserID) OR
(TypeID = 2 AND TypeAuxID = @DepartmentID)
AND ApplicationID = 1

2) Daha sonra hepsini bir araya katılmadan, izin her tür için bir eşleştirme tablosunu kullanın.

SELECT COUNT(perm.PermissionID)
FROM application_permissions perm
LEFT JOIN application_UserPermissions emp
ON perm.ApplicationID = emp.ApplicationID
LEFT JOIN application_DepartmentPermissions dept
ON perm.ApplicationID = dept.ApplicationID
WHERE q.SectionID=@SectionID
  AND (emp.UserID=@UserID OR dept.DeptID=@DeptID OR
 (emp.UserID IS NULL AND dept.DeptID IS NULL)) AND ApplicationID = 1
ORDER BY q.QID ASC

Düşüncelerim

Ben örnekler mantıklı umuyoruz. Ben onları bir araya Arnavut kaldırımlı.

İlk örnek daha az çalışma gerektirir, ama ikisi de iyi yanıtı gibi hissediyorum. Bu işlemek için daha iyi bir yolu var mı?

Oluştur 04/08/2008 saat 18:46
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
10

John Downey katılıyorum.

Şahsen, bazen bir izin bayraklı sıralamayı kullanınız. Bu şekilde Numaralandırmanın öğeleri, NOT ve XOR bitdüzeyi işlemleri için AND, OR olabilir.

"[Flags]
public enum Permission
{
    VIEWUSERS = 1, // 2^0 // 0000 0001
    EDITUSERS = 2, // 2^1 // 0000 0010
    VIEWPRODUCTS = 4, // 2^2 // 0000 0100
    EDITPRODUCTS = 8, // 2^3 // 0000 1000
    VIEWCLIENTS = 16, // 2^4 // 0001 0000
    EDITCLIENTS = 32, // 2^5 // 0010 0000
    DELETECLIENTS = 64, // 2^6 // 0100 0000
}"

Ardından, VE bitsel operatörünü kullanarak çeşitli izinleri birleştirebilirsiniz.

Bir kullanıcı görüntülemek ve kullanıcıları düzenleyebilirsiniz Örneğin, operasyon ikili sonucu Ondalık biçime dönüştürülüp 0000 0011 3. olduğunu
Ardından it would bizim durumumuzda (veritabanınızın tek sütuna bir kullanıcının izni saklayabilir olmak 3).

Başvurunuzun İçinde, sadece bir kullanıcı belirli bir izne sahip olmadığını başka bit düzeyinde işlem (OR) doğrulamak gerekir.

Cevap 04/08/2008 saat 19:23
kaynak kullanıcı

oy
10

Genellikle kodlama izin sistemleri hakkında gitmek yolu 6 tablolar yaşıyor.

  • Kullanıcılar - Bu o tipik kullanıcıların tablodur oldukça yalındır
  • Gruplar - Bu bölümlere eşanlamlı olacaktır
  • Roller - Bu genellikle aynı zamanda bir insan okunabilir adı ve açıklaması dahil tüm izinlere sahip bir tablodur
  • Users_have_Groups - Bu bir kullanıcı ait olanı gruba birçok çoğa tablodur
  • Users_have_Roles - rolleri bireysel kullanıcıya atanan şeyin başka birçok çoğa tablo
  • Groups_have_Roles - her grup neler rolleri nihai birçok çoğa tablo

Bir kullanıcıların oturumun başında sen, dizin veya bir grup içinden ya da atamış her rolü ortaya çıkarır bazı mantık aday olacağını. Sonra da güvenlik izinleri olarak bu rollerin karşı kod.

Sanki bu ben genellikle yapmak ama km kullanım hakkı değişebilir budur söyledi.

Cevap 04/08/2008 saat 18:56
kaynak kullanıcı

oy
2

Dürüst ASP.NET üyelik / Roller özellikleri anlatılan senaryo için mükemmel çalışacak. Kendi tablolar / procs / sınıfları Yazma büyük bir egzersiz olduğunu ve dakika ayrıntıları üzerinde çok güzel kontrolünü alabilirsiniz, ama kendim yaptıktan sonra ben sadece .NET şeyler inşa kullanmak daha iyidir sonucuna ettik. Varolan kodu bir sürü de iyi güzel olan etrafında çalışmak için tasarlanmıştır. Yazma sıfırdan bana yaklaşık 2 hafta sürdü ve .NETs kadar sağlam yerin yakınında bile değildi. Bu kadar çok bok (şifre kurtarma, oto lokavt, şifreleme, rolleri, bir izin arayüzü, procs ton, vs) kodlamak zorunda ve zaman daha iyi başka bir yerde geçirmiş olabilir.

Soruna cevap vermedi eğer Üzgünüm, birisi bir fi soru sorduğunda c # öğrenmeye diyor adam gibiyim.

Cevap 07/08/2008 saat 03:23
kaynak kullanıcı

oy
2

John Downey ve jdecuyper en çözümlere ek olarak, aynı zamanda bir Gruba, rol üyeliğinin katkı izinleri gerçekleştirebilir, böylece saklayıcısında sonu / başında bit "Açık Reddet" ve ardından açık dayalı izinleri çıkarma ekledik inkar girişleri, NTFS işleri çok gibi, izne bilge.

Cevap 04/08/2008 saat 19:39
kaynak kullanıcı

oy
0

Çeşitli uygulamalarda kullandım bir yaklaşım bir değişken değer özelliği olan bir genel PermissionToken sınıf sahip olmaktır. O zaman PermissionTokens kullanmak için gerekli olan söyler, istenen uygulamayı sorgulamak.

Örneğin, Nakliye uygulama ihtiyacı söyleyebilir:

new PermissionToken()
{
    Target = PermissionTokenTarget.Application,
    Action = PermissionTokenAction.View,
    Value = "ShippingApp"
};

Bu tabii ki, çünkü özel Değer özelliğinin, vb, Düzen oluşturun Sil uzatılabilir edilebilir, herhangi bir uygulama, modül veya widget'ı kendi gerekli izinleri tanımlayabilirsiniz. YMMV, ancak bu her zaman iyi ölçekli bulduk benim için verimli bir yöntem olmuştur.

Cevap 04/08/2008 saat 19:03
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more