Bir kullanıcı kimlik doğrulama (Roller ve Haklar) modülü tasarlama


15

Delphi UI uygulamasının arka ucu olacak bir MS SQL Server veritabanı için bir kullanıcı kimlik doğrulama modülü modellemeye çalışıyorum. Temel olarak, kullanıcının yalnızca bir gruba ait olduğu kullanıcı hesaplarına sahip olmak istiyorum. Bir grubun "n" hak sayısı olabilir.

Ayrıca, kullanıcının bir uygulama ayarına (örneğin her 90 günde bir) parolasını değiştirmesi gerekeceğinden veritabanına parola geçmişi eklemek istiyorum.

Ayrıca, bir kullanıcının her giriş ve çıkışında bir etkinlik kaydetmek istiyorum. Bunu gelecekteki ek etkinliklere genişletebilirim.

Aşağıda ilk çatlağımı bulacaksınız. Lütfen bunu geliştirmek için herhangi bir öneri bildirin, çünkü bunu ilk defa yapıyorum.

Rol tabanlı güvenlik için ek özelliklere ve şifre kuralları / son kullanma süreleri için kısıtlamalara gereksinim duyuyor musunuz?

db-dizayn


Ayrıntılı bir blog burada: goo.gl/ATnj6j
Suresh Kamrushi

1
Bir şey anlamıyorum. Kullanıcı tablosunda group_id var. Bir kişi birden fazla grubun üyesi olabilir mi?
johnny

Yanıtlar:


11

Belirttiğiniz gereksinimlere göre, modeliniz oldukça iyi durumda.

İşte iyileştirme için bazı öneriler:

  • Çok açık bir şekilde söylemiyorsunuz, bu yüzden söylemek zor - ama kullanıcı şifresini doğrudan saklıyormuşsunuz gibi görünüyor. Bu çok kötü olurdu ! Genel kimlik doğrulama veritabanlarına bakarsanız, şifreler şifrelenmiş biçimde saklanır. Sıklıkla hem bir passwordsütun hem de bir sütun görürsünüz password_salt.

  • Sizin USER_LOGStablo bir sahiptir Eventsütunu. Bunun nasıl doldurulacağı konusunda net değilsiniz. Referans EVENT_TYPEveren bir tablo olmalı mı USER_LOGS? Bu, daha arkadaşça raporlar için uygun olabilir. Tipik olaylar arasında oturum açma, oturum kapatma, şifre hatası, şifre değiştirme, şifre sıfırlama, kilitleme, kilit açma, ...

  • Sizin GROUP_RIGHTStablo haklar tanıyan kim göstermez. Denetim izi amacıyla, insanlar genellikle kimin ne zaman ve hangi kaydı değiştirdiğinin kaydını tutar. Bu sizin için bir sorun olmayabilir.

Aşağıda belirtilen işletme gereksinimlerinizle ilgili, "ders kitabı" rol tabanlı güvenlik modelinden birkaç şekilde farklılık gösteren birkaç soru verilmiştir:

  • Kullanıcıların yalnızca tek bir grupta olmasını istediğinizden emin misiniz? Rol tabanlı güvenliğin avantajı, rollerin oldukça statik olma eğilimindedir, rolleri yerine getiren insanlar oldukça sık gelir ve gider. Buna dahil bazı insanlar genellikle "iki şapka giyer".

  • Tasarımınız sadece hibe amaçlıdır. Bazı sistemler hibe ve iptali içerir . Bu, belirli bir grup için yaygın olarak bulunan bir hakkın mevcut olmadığını söylemenizi sağlar.

  • USERSTasarımınızda olduğu gibi gelen kullanıcı ve hesaplarınız var . Kişiler ve kullanıcı kimlikleri arasında genellikle bir ayrım vardır . Bazı kullanıcı kimlikleri ekipler veya makineler içindir ve bazı kişiler farklı amaçlar için birden fazla kullanıcı kimliğine sahiptir. Bu size yardımcı olacak bir ayrım mı?


3

Bence bitwise operatör kullanıcı iznini uygulamanın en iyi yoludur. Burada Mysql ile nasıl uygulayabileceğimizi göstereceğim.

Aşağıda bazı örnek verileri içeren bir örnek tablo bulunmaktadır:

Tablo 1 : İzin tablosunu 1,2,4,8..etc (bit 2'nin katları) gibi bit adıyla birlikte saklama izni tablosu

CREATE TABLE IF NOT EXISTS `permission` (
  `bit` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`bit`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Bazı örnek verileri tabloya ekleyin.

INSERT INTO `permission` (`bit`, `name`) VALUES
(1, 'User-Add'),
(2, 'User-Edit'),
(4, 'User-Delete'),
(8, 'User-View'),
(16, 'Blog-Add'),
(32, 'Blog-Edit'),
(64, 'Blog-Delete'),
(128, 'Blog-View');

Tablo 2 : Kullanıcı kimliğini, adını ve rolünü kaydetmek için kullanıcı tablosu. Rol, izinlerin toplamı olarak hesaplanacaktır.
Örnek:
'Ketan' kullanıcısı 'Kullanıcı-Ekle' (bit = 1) ve 'Blog-Sil' (bit-64) iznine sahipse, rol 65 (1 + 64) olur.
'Blog-View' (bit = 128) ve 'User-Delete' (bit-4) iznine sahip 'Mehata' kullanıcısı bu durumda rol 132 (128 + 4) olacaktır.

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `role` int(11) NOT NULL,
  `created_date` datetime NOT NULL
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

Örnek veri-

INSERT INTO `user` (`id`, `name`, `role`, `created_date`)
   VALUES (NULL, 'Ketan', '65', '2013-01-09 00:00:00'),
   (NULL, 'Mehata', '132', '2013-01-09 00:00:00');

Kullanıcının yetkilendirme izni Oturum açtıktan sonra, izin almak için aşağıda sorgulayabileceğimizden daha fazla kullanıcı izni yüklemek istiyorsak:

SELECT permission.bit,permission.name  
   FROM user LEFT JOIN permission ON user.role & permission.bit
 WHERE user.id = 1

Burada user.role "&" allow.bit, çıktıyı -

User-Add - 1
Blog-Delete - 64

Hava durumunu kontrol etmek istiyorsak, belirli bir kullanıcının kullanıcı düzenleme iznine sahip olup olmadığı-

  SELECT * FROM `user` 
     WHERE role & (select bit from permission where name='user-edit')

Çıktı = Satır yok.

Ayrıca şunu da görebilirsiniz: http://goo.gl/ATnj6j


100 gibi izinler çoksa ne yapacağız?
ypercubeᵀᴹ

2
Farklı sorulara 3 özdeş cevap gönderdiniz! -, bugün birkaç dakika arayla gönderildi. Bu iyi bir uygulama değil. Soruların yeterince özdeş ya da benzer olduğunu düşünüyorsanız, soruları kopya olarak kapatmak için oy verebilirsiniz (ya da kapanış için oy kullanmak için itibarınız yoksa işaretleyebilirsiniz).
ypercubeᵀᴹ

Lütfen bağlantınızı düzenleyin ve neye sahip olduğunu açıklayın (daha fazla ayrıntı, blogunuz mu yoksa bir başkasının mı, vb.)
ypercubeᵀᴹ

Lütfen aynı cevabı kopyalayıp yapıştırmayın, bir sürü eski soruya püskürtün. Bu sorular aynıysa, soruları kopya olarak işaretleyin.
Aaron Bertrand
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.