การออกแบบโมดูลการควบคุมอัตโนมัติของผู้ใช้ (บทบาทและสิทธิ์)


15

ฉันพยายามสร้างโมเดลโมดูลการพิสูจน์ตัวตนผู้ใช้สำหรับฐานข้อมูล MS SQL Server ที่จะเป็นแบ็คเอนด์ไปยังแอปพลิเคชัน Delphi UI โดยทั่วไปฉันต้องการมีบัญชีผู้ใช้ที่ผู้ใช้อยู่ในกลุ่มเดียวเท่านั้น กลุ่มสามารถมีจำนวนสิทธิ์ "n"

ฉันต้องการเพิ่มประวัติรหัสผ่านในฐานข้อมูลเนื่องจากผู้ใช้จะต้องเปลี่ยนรหัสผ่านตามการตั้งค่าแอปพลิเคชัน (ตัวอย่างเช่นทุก ๆ 90 วัน)

ฉันต้องการบันทึกกิจกรรมในแต่ละครั้งที่ผู้ใช้ลงชื่อเข้าและออก ฉันอาจขยายสิ่งนี้ไปยังกิจกรรมเพิ่มเติมในอนาคต

ด้านล่างคุณจะพบรอยแตกครั้งแรกของฉันที่มัน โปรดแจ้งให้ฉันทราบข้อเสนอแนะเพื่อปรับปรุงตามนี้เป็นครั้งแรกของฉันทำเช่นนี้

คุณเห็นความต้องการคุณลักษณะเพิ่มเติมสำหรับการรักษาความปลอดภัยตามบทบาทและข้อ จำกัด สำหรับกฎรหัสผ่าน / รอบระยะเวลาหมดอายุหรือไม่?

ฐานข้อมูลการออกแบบ


บล็อกรายละเอียดอยู่ที่นี่: goo.gl/ATnj6j
Suresh Kamrushi

1
ฉันไม่เข้าใจบางสิ่ง ในตารางผู้ใช้คุณมี group_id บุคคลสามารถเป็นสมาชิกมากกว่าหนึ่งกลุ่มได้หรือไม่?
johnny

คำตอบ:


11

ตามความต้องการที่ระบุไว้โมเดลของคุณอยู่ในสภาพดี

นี่คือคำแนะนำสำหรับการปรับปรุง:

  • คุณไม่พูดอย่างชัดเจนดังนั้นจึงยากที่จะพูด - แต่ดูเหมือนว่าคุณอาจเก็บรหัสผ่านของผู้ใช้โดยตรง มันจะแย่มาก ! หากคุณดูฐานข้อมูลการพิสูจน์ตัวตนทั่วไปรหัสผ่านจะถูกเก็บไว้ในรูปแบบที่เข้ารหัส คุณมักจะเห็นทั้งpasswordคอลัมน์และpassword_saltคอลัมน์

  • USER_LOGSตารางของคุณมีEventคอลัมน์ คุณยังไม่ชัดเจนเกี่ยวกับวิธีการที่จะเพิ่มจำนวนประชากร ควรจะมีEVENT_TYPEตารางที่USER_LOGSอ้างอิง? สิ่งนี้อาจทำเพื่อการรายงานที่เป็นมิตร เหตุการณ์ทั่วไปจะรวมถึงการเข้าสู่ระบบออกจากระบบรหัสผ่านล้มเหลวเปลี่ยนรหัสผ่านรีเซ็ตรหัสผ่านล็อคออกปลดล็อค ...

  • GROUP_RIGHTSตารางของคุณไม่ได้ระบุว่าใครเป็นผู้ให้สิทธิ์ เพื่อจุดประสงค์ในการตรวจสอบบัญชีผู้คนมักจะเก็บบันทึกของใครเป็นคนเปลี่ยนระเบียนและเมื่อใด นั่นอาจไม่ใช่ปัญหาสำหรับคุณ

ต่อไปนี้เป็นคำถามสองสามข้อเกี่ยวกับข้อกำหนดทางธุรกิจที่ระบุของคุณซึ่งแตกต่างจากรูปแบบการรักษาความปลอดภัยตามบทบาท "หนังสือตำรา" ในสองวิธี:

  • คุณแน่ใจหรือไม่ว่าต้องการให้ผู้ใช้อยู่ในกลุ่มเดียว? ข้อดีของการรักษาความปลอดภัยตามบทบาทคือบทบาทมีแนวโน้มที่จะค่อนข้างคงที่ในขณะที่ผู้คนเติมเต็มบทบาทมาและไปบ่อยครั้ง รวมอยู่ในนี้คือบางคนมักจะ "สวมหมวกสองใบ"

  • การออกแบบของคุณให้สิทธิ์เท่านั้น ระบบบางอย่างรวมถึงทุน และ เพิกถอน สิ่งนี้ช่วยให้คุณสามารถพูดได้ว่าสิทธิที่มีอยู่อย่างกว้างขวางนั้นไม่สามารถใช้ได้กับกลุ่มใดกลุ่มหนึ่ง

  • คุณมีผู้ใช้และบัญชีมาUSERSในแบบของคุณ มักจะมีความแตกต่างระหว่างคนและรหัสผู้ใช้ ID ผู้ใช้บางอย่างใช้สำหรับทีมหรือเครื่องและบางคนมี ID ผู้ใช้หลายรายการเพื่อจุดประสงค์ที่แตกต่างกัน นี่คือความแตกต่างที่จะเป็นประโยชน์กับคุณ?


3

ฉันคิดว่าตัวดำเนินการระดับบิตเป็นวิธีที่ดีที่สุดในการใช้สิทธิ์ผู้ใช้ ที่นี่ฉันจะแสดงวิธีที่เราสามารถใช้กับ Mysql

ด้านล่างเป็นตารางตัวอย่างที่มีข้อมูลตัวอย่าง:

ตารางที่ 1 : ตารางสิทธิ์ในการจัดเก็บชื่อการอนุญาตพร้อมกับบิตเช่น 1,2,4,8..etc (หลายจาก 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;

แทรกข้อมูลตัวอย่างลงในตาราง

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

ตารางที่ 2 : ตารางผู้ใช้เพื่อเก็บ ID ผู้ใช้ชื่อและบทบาท บทบาทจะถูกคำนวณเป็นผลรวมของสิทธิ์
ตัวอย่าง:
หากผู้ใช้ 'Ketan' ได้รับอนุญาตจาก 'ผู้ใช้เพิ่ม' (บิต = 1) และ 'บล็อกลบ' (บิต -64) ดังนั้นบทบาทจะเป็น 65 (1 + 64)
หากผู้ใช้ 'Mehata' ได้รับอนุญาตจาก 'มุมมองบล็อก' (บิต = 128) และ 'ผู้ใช้ลบ' (บิต -4) ดังนั้นบทบาทจะเป็น 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;

ตัวอย่างข้อมูล -

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

การอนุญาตให้ใช้รหัสของผู้ใช้หลังจากเข้าสู่ระบบหากเราต้องการโหลดสิทธิ์ผู้ใช้มากกว่าที่เราสามารถสอบถามด้านล่างเพื่อรับสิทธิ์:

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

ที่นี่ user.role "&" permission.bit เป็นตัวดำเนินการ Bitwise ซึ่งจะให้ผลลัพธ์เป็น -

User-Add - 1
Blog-Delete - 64

หากเราต้องการตรวจสอบสภาพอากาศผู้ใช้คนใดคนหนึ่งได้รับอนุญาตให้แก้ไขโดยผู้ใช้หรือไม่ -

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

เอาท์พุท = ไม่มีแถว

คุณสามารถดูได้ที่: http://goo.gl/ATnj6j


และเราจะทำอย่างไรถ้าสิทธิ์เป็นจำนวนมากเช่น 100
ypercubeᵀᴹ

2
คุณโพสต์คำตอบที่เหมือนกัน 3 ข้อสำหรับคำถามที่แตกต่าง! - ทั้งหมดโพสต์ในวันนี้โดยแยกห่างกันเพียงไม่กี่นาที นี่ไม่ใช่วิธีปฏิบัติที่ดี หากคุณคิดว่าคำถามเหมือนกันหรือคล้ายกันมากพอคุณสามารถลงคะแนนเพื่อปิดเป็นคำถามซ้ำ (หรือตั้งค่าสถานะคำถามเหล่านั้นหากคุณไม่มีชื่อเสียงที่จะลงคะแนนให้ปิด)
ypercubeᵀᴹ

โปรดแก้ไขลิงก์ของคุณและอธิบายว่ามีอะไรบ้าง (รายละเอียดเพิ่มเติมมันเป็นบล็อกของคุณหรือของคนอื่น ฯลฯ )
ypercubeᵀᴹ

โปรดอย่าคัดลอกและวางคำตอบเดียวกันฉีดพ่นคำถามเก่า ๆ หากคำถามเหล่านั้นเหมือนกันให้ตั้งค่าสถานะเป็นคำถามซ้ำ
Aaron Bertrand
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.