it-swarm-eu.dev

Návrh modulu ověřování uživatelů (role a práva)

Snažím se modelovat modul User Authentication pro databázi MS SQL Server, který bude zadní částí aplikace Delphi UI. V podstatě chci mít uživatelské účty, kde uživatel patří pouze do jedné skupiny. Skupina může mít „n“ počet práv.

Chci také přidat historii hesel do databáze, protože uživatel bude muset změnit své heslo na základě nastavení aplikace (například každých 90 dní).

Chci také přihlásit událost pro každé přihlášení a odhlášení uživatele. Mohu to v budoucnu rozšířit na další události.

Níže najdete moji první trhlinu. Prosím, dejte mi vědět nějaké návrhy, jak to vylepšit, protože toto je moje poprvé.

Vidíte nějakou potřebu dalších atributů pro zabezpečení na základě rolí a omezení pravidel pro hesla/období vypršení platnosti?

db-design

15
Johnny Holmes

Na základě uvedených požadavků je váš model v dobré kondici.

Zde je několik návrhů na zlepšení:

  • Neříkáte to výslovně, takže je těžké to říct - ale vypadá to, že byste si mohli uživatelské heslo přímo uložit. To by bylo velmi špatné! Pokud se podíváte na běžné autentizační databáze, hesla jsou uložena v zašifrované podobě. Často uvidíte sloupec password a password_salt sloupec.

  • Vaše USER_LOGS tabulka má sloupec Event. Nejste si jisti, jak se to má naplnit. Měl by existovat EVENT_TYPE tabulka, která USER_LOGS Reference? To by mohlo přispět k přátelštějšímu hlášení. Mezi typické události patří přihlášení, odhlášení, selhání hesla, změna hesla, resetování hesla, uzamčení, odemknutí, ...

  • Vaše GROUP_RIGHTS tabulka neuvádí, kdo udělil práva. Pro účely kontrolních záznamů lidé často vedou záznamy o tom, kdo změnil, jaký záznam a kdy. To pro vás nemusí být problém.

Zde je několik otázek týkajících se vašich stanovených obchodních požadavků, které se od vzoru zabezpečení „textové knihy“ liší několika způsoby:

  • Opravdu chcete, aby uživatelé byli pouze v jedné skupině? Výhodou zabezpečení na základě rolí je to, že role bývají docela statické, zatímco lidé plnící role přicházejí a odcházejí docela často. Zahrnuto v tom je, že někteří lidé často „nosí dva klobouky“.

  • Váš design je pouze grant. Některé systémy zahrnují grant a odvolání. To vám umožní říci, že široce dostupná práva nejsou pro konkrétní skupinu k dispozici.

  • Ve vašem návrhu máte uživatele a účty jako USERS. Často existuje rozdíl mezi lidmi a uživatelskými ID . Některá ID uživatelů jsou pro týmy nebo stroje a někteří lidé mají více ID uživatelů pro různé účely. Je to rozdíl, který by vám pomohl?

11
Joel Brown

Myslím, že bitový operátor je nejlepší způsob, jak implementovat uživatelské oprávnění. Tady ukazuji, jak to můžeme implementovat pomocí Mysql.

Níže jsou ukázkové tabulky s některými ukázkovými daty:

Tabulka 1 : Tabulka oprávnění k ukládání názvu oprávnění spolu s ním bit jako 1,2,4,8..etc (násobek 2)

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

Vložte do tabulky některá ukázková data.

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');

Tabulka 2 : Tabulka uživatelů pro uložení ID uživatele, jména a role. Role bude počítána jako součet oprávnění.
Příklad:
Pokud uživatel 'Ketan', který má povolení 'Přidat uživatele' (bit = 1) a 'Odstranit blog' (bit-64), bude mít role 65 (1 + 64).
Pokud uživatel 'Mehata' s povolením 'Blog-View' (bit = 128) a 'User-Delete' (bit-4), bude role 132 (128 + 4).

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;

Vzorek dat-

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');

Povolení uživatele k přihlášení Po přihlášení, pokud chceme načíst uživatelské oprávnění, než můžeme získat dotaz, abychom získali oprávnění:

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

Zde user.role "&" permission.bit je operátor Bitwise, který vydá výstup jako -

User-Add - 1
Blog-Delete - 64

Pokud chceme zkontrolovat počasí, má konkrétní uživatel povolení k úpravám uživatele nebo ne-

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

Výstup = Žádné řádky.

Můžete také vidět: http://goo.gl/ATnj6j

3
Suresh Kamrushi