(งานระหว่างดำเนินการ: เอกสารสำหรับ 2.0)
ห้องสมุดสำหรับจัดการการระบุตัวตนผู้ใช้
วัตถุประสงค์ของไลบรารีนี้คือเพื่อค้นหาบัญชีผู้ใช้ (ให้ชัดเจน - รหัสเฉพาะ) สำหรับการพิสูจน์ตัวตนที่กำหนดและเพื่อจัดการข้อมูลประจำตัวประเภทต่างๆ ประกอบด้วยบริการที่แตกต่างกัน 4 บริการ: การระบุตัวตน การลงทะเบียน การค้นหา และการกู้คืน
คุณสามารถเพิ่มไลบรารีในโครงการของคุณโดยใช้ผู้แต่งด้วยคำสั่งต่อไปนี้:
composer require teresko/ palladiumหากต้องการใช้แพ็คเกจนี้ จำเป็นต้องมี PHP เวอร์ชัน 7.0+ และ PDO
คุณจะต้องสร้างตารางที่จะเก็บ ข้อมูลประจำตัว ด้วย สคีมาตัวอย่างมีอยู่ที่นี่ ขณะนี้มีเพียงคำจำกัดความของตารางสำหรับ MySQL/MariaDB เท่านั้น แต่ไลบรารีนี้สามารถใช้กับ RDBMS ใดก็ได้ที่มีไดรเวอร์ PDO
palladium มี 4 บริการ: Registration Identification Search และ Recovery แต่ละบริการเหล่านี้มีการขึ้นต่อกันที่จำเป็นสองรายการ:
palladium ContractCanPersistIdenity )PsrLogLoggerInterface )สิ่งนี้ให้ตัวเลือกแก่คุณในการแทนที่พื้นที่เก็บข้อมูลเริ่มต้น หากคุณต้องการแก้ไขหรือแทนที่บางส่วนของเลเยอร์นามธรรมที่คงอยู่ สำหรับตัวบันทึก - แนวทางที่แนะนำคือการใช้ Monolog แต่จะใช้ได้กับระบบบันทึกที่เข้ากันได้
พื้นที่เก็บข้อมูลเริ่มต้นยังมาพร้อมกับฟังก์ชันสำหรับการเพิ่ม ประเภทข้อมูลประจำตัวที่กำหนดเอง และตัวแมปข้อมูลที่ใช้สำหรับประเภทข้อมูลประจำตัวของคุณหรือภายใน สำหรับรายละเอียดการใช้งาน โปรดดูส่วน %TODO%
ในตัวสร้างของบริการ Identification มีพารามิเตอร์ทางเลือกที่สามและสี่:
ในตัวสร้างบริการ Registration จะมีพารามิเตอร์ตัวที่สามที่เป็นทางเลือก:
ตามที่ระบุไว้ข้างต้น บริการทั้ง 4 รายการคาดว่าจะมีที่เก็บข้อมูลเป็นการพึ่งพาตัวสร้าง หากคุณไม่ได้แทนที่พื้นที่เก็บข้อมูลแบบบันเดิลด้วยเวอร์ชันแบบกำหนดเองของคุณ คุณจะต้องเริ่มต้น palladium RepositoryIdentity และส่งต่อไปยังบริการ
พื้นที่เก็บข้อมูลแบบรวมนั้นมีการพึ่งพาเดียว: อินสแตนซ์ที่ใช้ palladium ContractCanCreateMapper สัญญา (อินเทอร์เฟซ) นี้ดำเนินการโดย palladium ComponentMapperFactory และโรงงานนี้มีการขึ้นต่อกันสองรายการ: อินสแตนซ์ PDO และชื่อของตารางที่จะเก็บ ข้อมูลประจำตัว
<?php
$ factory = new palladium Component MapperFactory ( new PDO (... $ config ), $ tableName );
$ repository = new palladium Repository Identity ( $ factory ); ในทุกตัวอย่างโค้ดอื่นๆ ที่คุณเห็นตัวแปร $repository ถูกใช้ คุณสามารถสันนิษฐานได้ว่าตัวแปรดังกล่าวได้รับการเตรียมใช้งานโดยใช้ตัวอย่างโค้ดนี้
สำหรับผู้ใช้ Symfony's DependencyInjection Component (เวอร์ชัน: 3.4+) จะมีไฟล์การกำหนดค่าตัวอย่าง: %TODO%
<?php
$ registration = new palladium Service Registration ( $ repository , $ logger );
$ identity = $ registration -> createStandardIdentity ( ' [email protected] ' , ' password ' );
$ registration -> bindAccountToIdentity ( $ accountId , $ identity ); หากการดำเนินการเสร็จสมบูรณ์ ตัวแปร $identity จะมีอินสแตนซ์ของ StandardIdentity ที่ไม่ได้รับการตรวจสอบ เพื่อให้การยืนยันเสร็จสมบูรณ์ คุณจะต้องใช้โทเค็นที่มีข้อมูลประจำตัวอยู่ ในตัวอย่างที่ให้มา โทเค็นนี้สามารถประเมินได้โดยใช้ $instance->getToken()
เมธอด createStandardIdentity() สามารถส่งข้อยกเว้น IdentityConflict ได้ หากมีการใช้อีเมลสำหรับข้อมูลประจำตัวอื่นแล้ว
เมธอด createStandardIdentity() มีพารามิเตอร์ตัวที่สามที่ไม่บังคับ ซึ่งกำหนดอายุการใช้งานของโทเค็นการยืนยันอีเมลในหน่วยวินาที เมื่อนำไปใช้ ตัวอย่างก่อนหน้านี้จะมีลักษณะดังนี้:
<?php
$ registration = new palladium Service Registration ( $ repository , $ logger );
$ identity = $ registration -> createStandardIdentity ( ' [email protected] ' , ' password ' , 3600 );
$ registration -> bindAccountToIdentity ( $ accountId , $ identity ); ซึ่งจะทำให้โทเค็นการยืนยันใช้งานได้เป็นเวลา 1 ชั่วโมงหลังจากลงทะเบียนข้อมูลระบุตัวตนของผู้ใช้รายนี้ หลังจากเวลาที่กำหนดผ่านไป คุณจะไม่สามารถค้นหาข้อมูลระบุตัวตนนี้โดยใช้ findStandardIdentityByToken() ในบริการ Search
สิ่งสำคัญ : เมธอด
createStandardIdentity()จะไม่ตรวจสอบอีเมลของผู้ใช้หรือตัวระบุประเภทอื่นใด มันตรวจสอบเฉพาะเอกลักษณ์ของมันเท่านั้น การตรวจสอบความถูกต้องของอีเมล หมายเลขโทรศัพท์ ชื่อเล่น และตัวระบุอื่น ๆ อยู่นอกเหนือขอบเขตของห้องสมุดนี้
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ registration = new palladium Service Registration ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByToken ( $ token , palladium Entity Identity:: ACTION_VERIFY );
$ registration -> verifyStandardIdentity ( $ identity ); ค่า $token ใช้เพื่อค้นหา EmailIdentity ที่ตรงกัน ซึ่งได้รับการยืนยันแล้ว หากไม่พบข้อมูลประจำตัว findStandardIdentityByToken() จะส่งข้อยกเว้น IdentityNotFound
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ cookie = $ identification -> loginWithPassword ( $ identity , $ password ); หากไม่พบข้อมูลประจำตัวที่ตรงกับตัวระบุที่กำหนด (เช่น ที่อยู่อีเมล) เมธอด findStandardIdentityByIdentifier() จะส่งข้อยกเว้น IdentityNotFound
ในกรณีที่รหัสผ่านไม่ตรงกัน เมธอด loginWithPassword() จะส่งข้อยกเว้น PasswordMismatch
<?php
$ identity = $ this -> registration -> createNonceIdentity ( $ accountId ); สิ่งนี้จะสร้างอินสแตนซ์ใหม่ของ NonceIdentity หากต้องการใช้เข้าสู่ระบบ คุณจะต้องมีค่าใน NonceIdentity::getIdentifier() และ NonceIdentity::getKey() โดยที่ตัวระบุจะถูกใช้เพื่อค้นหาข้อมูลประจำตัวของ nonce และคีย์จะถูกใช้ในการตรวจสอบ
เมธอด createNonceIdentity() เป็นพารามิเตอร์ตัวที่สองที่เป็นทางเลือก ซึ่งกำหนดอายุการใช้งานเอกลักษณ์แบบใช้ครั้งเดียวนี้เป็นวินาที เมื่อนำไปใช้ ตัวอย่างก่อนหน้านี้จะมีลักษณะดังนี้:
<?php
$ identity = $ this -> registration -> createNonceIdentity ( $ accountId , 600 ); ซึ่งจะทำให้ข้อมูลระบุตัวตนแบบใช้ครั้งเดียวสามารถใช้งานได้เป็นเวลา 10 นาทีหลังจากการสร้าง หลังจากผ่านเวลาที่อนุญาตแล้ว การส่งข้อมูลประจำตัวนี้ในเมธอด useNonceIdentity() ของ Identification จะส่งผลให้มีข้อยกเว้น IdentityExpired ถูกส่งออกไป
<?php
$ identity = $ this -> search -> findNonceIdentityByIdentifier ( $ identifier );
$ cookie = $ this -> identification -> useNonceIdentity ( $ identity , $ key ); หากไม่พบข้อมูลประจำตัวที่ตรงกับตัวระบุที่ระบุ (ที่อยู่อีเมล ชื่อเล่น ฯลฯ) เมธอด findNonceIdentityByIdentifier() จะส่งข้อยกเว้น IdentityNotFound
ในกรณีที่รหัสผ่านไม่ตรงกัน เมธอด useNonceIdentity() จะส่งข้อยกเว้น KeyMismatch
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findCookieIdentity ( $ accountId , $ series );
$ cookie = $ identification -> loginWithCookie ( $ identity , $ key ); หากไม่พบคุกกี้โดยใช้ findCookieIdentity() ข้อยกเว้น IdentityNotFound มาตรฐานจะถูกส่งออกไป สาเหตุที่เป็นไปได้อาจเป็นเพราะคุกกี้ไม่ทำงานอีกต่อไป (เช่น ผู้ใช้ออกจากระบบ) หรือคุกกี้ไม่มีอยู่เลย
ในกรณีที่คุกกี้เก่าเกินไป loginWithCookie() จะสร้างข้อยกเว้น IdentityExpired
แต่เมธอด loginWithCookie() ยังสามารถสร้างข้อยกเว้น CompromisedCookie ได้ การเห็นข้อยกเว้นนี้ อาจบ่งบอกได้ว่าคุกกี้นั้นถูกขโมย หรือผู้ใช้นั้นไม่เคยได้รับค่าคุกกี้ใหม่
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findCookieIdentity ( $ accountId , $ series );
$ identification -> blockIdentity ( $ identity );นี่เป็นวิธีที่แนะนำในการจัดการกับคุกกี้ที่น่าสงสัยซึ่งอาจถูกขโมยหรือไม่ถูกขโมย สิ่งนี้ ไม่ได้มีไว้สำหรับผู้ใช้ออกจากระบบ
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findCookieIdentity ( $ accountId , $ series );
$ identification -> logout ( $ identity , $ key );การดำเนินการนี้ทำเครื่องหมายคุกกี้ว่า "ถูกละทิ้ง" รายการข้อยกเว้นที่สามารถสร้างได้ ตรงกับรายการที่อธิบายไว้ในส่วนการเข้าสู่ระบบโดยใช้คุกกี้
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ recovery = new palladium Service Recovery ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ token = $ recovery -> markForReset ( $ identity ); หากไม่พบข้อมูลประจำตัวที่ตรงกับที่อยู่อีเมลที่ระบุ เมธอด findStandardIdentityByIdentifier() จะส่งข้อยกเว้น IdentityNotFound
เมื่อเรียกใช้ markForReset() จะต้องจัดเตรียมอินสแตนซ์ของ StandardIdentity ที่ได้รับการยืนยันแล้ว (ไม่เช่นนั้น ข้อมูลส่วนตัวของผู้ใช้อาจรั่วไหลจากแอปพลิเคชันของคุณ) หากไม่เป็นเช่นนั้น วิธีการจะเกิดข้อยกเว้น IdentityNotVerified
เมธอด markForReset() เป็นพารามิเตอร์ตัวที่สองที่ไม่บังคับ ซึ่งกำหนดอายุการใช้งานของโทเค็นการรีเซ็ตรหัสผ่านในหน่วยวินาที เมื่อนำไปใช้ ตัวอย่างก่อนหน้านี้จะมีลักษณะดังนี้:
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ recovery = new palladium Service Recovery ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ token = $ recovery -> markForReset ( $ identity , 7200 ); ซึ่งจะทำให้โทเค็นรีเซ็ตรหัสผ่านใช้งานได้เป็นเวลาสองชั่วโมงหลังจากที่ข้อมูลระบุตัวตนของผู้ใช้รายนี้ถูกทำเครื่องหมายเพื่อรีเซ็ต เมื่อหมดเวลาที่กำหนด คุณจะไม่สามารถค้นหาข้อมูลระบุตัวตนนี้ได้โดยใช้ findEmailIdentityByToken() ในบริการ Search
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ recovery = new palladium Service Recovery ( $ repository , $ logger );
$ identity = $ search -> findEmailIdentityByToken ( $ token , palladium Entity Identity:: ACTION_RESET );
$ recovery -> resetIdentityPassword ( $ identity , ' foobar ' ); หากไม่พบข้อมูลประจำตัวที่ตรงกับโทเค็นที่กำหนด เมธอด findEmailIdentityByToken() จะส่งข้อยกเว้น IdentityNotFound
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ identification -> changePassword ( $ identity , $ oldPassword , $ newPassword ); หากไม่พบข้อมูลประจำตัวที่ตรงกับที่อยู่อีเมลที่ระบุ (หรือตัวระบุประเภทอื่นๆ) เมธอด findStandardIdentityByIdentifier() จะส่งข้อยกเว้น IdentityNotFound
ในกรณีที่รหัสผ่านไม่ตรงกัน เมธอด changePassword() จะส่งข้อยกเว้น PasswordMismatch
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ factory , $ logger );
$ list = $ search -> findIdentitiesByParentId ( $ identity -> getId ());
$ identification -> discardIdentityCollection ( $ list ); ค่าที่ส่งคืนของ findIdentitiesByParentId() จะส่งกลับ IdentityCollection ซึ่งสามารถเว้นว่างไว้ได้
ดังที่กล่าวไปแล้ว บริการในไลบรารีนี้คาดหวังว่าจะมีตัวบันทึกที่เข้ากันได้กับ PSR-3 เป็นตัวอ้างอิง มันจะใช้เพื่อบันทึกเหตุการณ์สามระดับ:
LogLevel::INFOระดับบันทึกนี้ใช้สำหรับการติดตามการดำเนินการทั่วไปที่ผู้ใช้จะดำเนินการ เมื่อใช้แอปพลิเคชันของคุณในลักษณะที่ตั้งใจไว้:
LogLevel::NOTICEบันทึกที่มีระดับนี้จะถูกบันทึก หากผู้ใช้พยายามดำเนินการไม่สำเร็จ ซึ่งไม่ควรเกิดขึ้นในสถานการณ์การใช้งานที่ถูกต้อง:
LogLevel::WARNINGใช้สำหรับกรณีการบันทึกเท่านั้น เมื่อผู้ใช้พยายามใช้คุกกี้ที่ถูกบุกรุก
ห้องสมุดนี้มุ่งเน้นไปที่งานเฉพาะงานเดียว ไม่ รวมฟังก์ชันการทำงานใดๆ ต่อไปนี้:
หากคุณคิดว่าไลบรารีการตรวจสอบสิทธิ์นั้นต้องการส่วนใดส่วนหนึ่งที่ระบุไว้ข้างต้น แสดงว่านี่ไม่ใช่ไลบรารีที่คุณกำลังมองหา