(งานระหว่างดำเนินการ: เอกสารสำหรับ 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
ใช้สำหรับกรณีการบันทึกเท่านั้น เมื่อผู้ใช้พยายามใช้คุกกี้ที่ถูกบุกรุก
ห้องสมุดนี้มุ่งเน้นไปที่งานเฉพาะงานเดียว ไม่ รวมฟังก์ชันการทำงานใดๆ ต่อไปนี้:
หากคุณคิดว่าไลบรารีการตรวจสอบสิทธิ์นั้นต้องการส่วนใดส่วนหนึ่งที่ระบุไว้ข้างต้น แสดงว่านี่ไม่ใช่ไลบรารีที่คุณกำลังมองหา