ฉันจะไม่เลือกที่จะแสดงความคิดเห็นต้นฉบับในแบบที่มันเป็นคำ แต่มันจะระบุปัญหาที่อาจเกิดขึ้นตามกฎหมาย
โดยเฉพาะความกังวลที่รับประกันแยกมีการตรวจสอบกับการอนุมัติ
การรับรองความถูกต้องหมายถึงกระบวนการเข้าสู่ระบบและการรับข้อมูลประจำตัว เป็นวิธีที่ระบบรู้ว่าคุณเป็นใครและใช้สำหรับสิ่งต่าง ๆ เช่นการปรับเปลี่ยนในแบบของคุณการเป็นเจ้าของวัตถุและอื่น ๆ
การอนุญาตหมายถึงสิ่งที่คุณได้รับอนุญาตให้ทำและสิ่งนี้ (โดยทั่วไป) ไม่ได้พิจารณาว่าคุณเป็นใคร แต่จะถูกกำหนดโดยนโยบายความปลอดภัยบางอย่างเช่นบทบาทหรือการอนุญาตซึ่งไม่สนใจสิ่งต่าง ๆ เช่นชื่อหรือที่อยู่อีเมลของคุณ
ทั้งสองนี้สามารถเปลี่ยนมุมฉากซึ่งกันและกัน ตัวอย่างเช่นคุณอาจเปลี่ยนรูปแบบการรับรองความถูกต้องโดยการเพิ่มผู้ให้บริการ OpenID / OpenAuth และคุณอาจเปลี่ยนนโยบายความปลอดภัยโดยเพิ่มบทบาทใหม่หรือเปลี่ยนจาก RBAC เป็น ABAC
หากสิ่งเหล่านี้เป็นคลาสหรือนามธรรมรหัสความปลอดภัยของคุณซึ่งเป็นหนึ่งในเครื่องมือที่สำคัญที่สุดในการลดความเสี่ยงกลายเป็นเรื่องที่มีความเสี่ยงสูง
ฉันทำงานกับระบบที่การพิสูจน์ตัวตนและการอนุญาตมีความสัมพันธ์แน่นเกินไป ในระบบเดียวมีฐานข้อมูลผู้ใช้แบบขนานสองฐานข้อมูลแต่ละประเภทสำหรับ "บทบาท" หนึ่งประเภท บุคคลหรือทีมที่ออกแบบมันไม่เคยคิดเลยว่าผู้ใช้ทางกายภาพเพียงคนเดียวอาจอยู่ในทั้งสองบทบาทหรืออาจมีการกระทำบางอย่างที่เหมือนกันกับหลายบทบาทหรืออาจมีปัญหาเกี่ยวกับการชนกันของรหัสผู้ใช้ นี่เป็นตัวอย่างที่สุดโต่ง แต่มันก็ / เจ็บปวดอย่างมากที่จะทำงานกับ
ไมโครซอฟท์และซัน / ออราเคิล (Java) หมายถึงการรวมของการตรวจสอบและอนุมัติข้อมูลเป็นความปลอดภัยของเงินต้น มันไม่สมบูรณ์แบบ แต่ทำงานได้ดีพอสมควร ใน. NET ตัวอย่างเช่นคุณมีIPrincipal
สิ่งที่ห่อหุ้มวัตถุIIdentity
- อดีตเป็นวัตถุนโยบาย (การอนุญาต) ในขณะที่หลังเป็นตัวตน (การรับรองความถูกต้อง) คุณพอจะตั้งคำถามกับการตัดสินใจที่จะใส่หนึ่งภายในของอื่น ๆ แต่สิ่งที่สำคัญก็คือว่ารหัสที่สุดที่คุณเขียนจะเป็นเพียงหนึ่งในแนวคิดซึ่งหมายความว่ามันเป็นเรื่องง่ายในการทดสอบและ refactor
ไม่มีอะไรผิดปกติกับUser.IsAdmin
ฟิลด์ ... เว้นแต่จะมีUser.Name
ฟิลด์ด้วย สิ่งนี้จะบ่งชี้ว่าแนวคิด "ผู้ใช้" ไม่ได้ถูกกำหนดอย่างเหมาะสมและนี่เป็นเรื่องน่าเศร้าที่เกิดข้อผิดพลาดที่พบบ่อยในหมู่นักพัฒนาซอฟต์แวร์ที่เปียกหลังใบหูเมื่อพูดถึงเรื่องความปลอดภัย โดยทั่วไปสิ่งเดียวที่ควรใช้ร่วมกันโดยข้อมูลประจำตัวและนโยบายคือ ID ผู้ใช้ซึ่งไม่ได้เกิดขึ้นโดยบังเอิญคือวิธีการนำไปใช้ในรูปแบบการรักษาความปลอดภัยทั้ง Windows และ * nix
เป็นที่ยอมรับได้อย่างสมบูรณ์ในการสร้างออบเจกต์ wrapper ที่หุ้มทั้งตัวตนและนโยบาย ตัวอย่างเช่นมันจะช่วยอำนวยความสะดวกในการสร้างหน้าจอแดชบอร์ดที่คุณต้องการแสดงข้อความ "สวัสดี" นอกเหนือจากวิดเจ็ตหรือลิงก์ต่างๆที่ผู้ใช้ปัจจุบันได้รับอนุญาตให้เข้าถึง ตราบใดที่ห่อหุ้มเพียงแค่นี้ตัดตัวตนและนโยบายข้อมูลและไม่ได้เรียกร้องที่จะเป็นเจ้าของมัน ในคำอื่น ๆ ตราบใดที่มันไม่ได้ถูกนำเสนอในฐานะที่เป็นรากรวม
รูปแบบความปลอดภัยแบบง่าย ๆดูเหมือนจะเป็นความคิดที่ดีเสมอเมื่อคุณออกแบบแอปพลิเคชั่นใหม่เป็นครั้งแรกเนื่องจาก YAGNI และสิ่งนั้น แต่มันมักจะกลับมากัดคุณในภายหลังเพราะแปลกใจแปลกใจเพิ่มคุณสมบัติใหม่ ๆ !
ดังนั้นหากคุณรู้ว่าอะไรดีที่สุดสำหรับคุณคุณจะต้องแยกข้อมูลการตรวจสอบและการอนุญาตออกจากกัน แม้ว่าตอนนี้ "การอนุญาต" ในตอนนี้จะง่ายเหมือนการตั้งค่าสถานะ "IsAdmin" คุณจะยังดีกว่าหากยังไม่ได้เป็นส่วนหนึ่งของคลาสหรือตารางเดียวกันกับข้อมูลการตรวจสอบสิทธิ์ดังนั้นถ้าและเมื่อนโยบายความปลอดภัยของคุณจำเป็นต้อง การเปลี่ยนแปลงคุณไม่จำเป็นต้องทำการผ่าตัดใหม่ในระบบตรวจสอบความถูกต้องซึ่งใช้งานได้ดี