(작업 진행 중: 2.0용 문서)
사용자 식별을 처리하는 라이브러리입니다.
이 라이브러리의 목적은 주어진 신원 증명에 대한 사용자 계정(정확히 말하면 고유 ID)을 찾고 다양한 유형의 신원을 관리하는 것입니다. 식별, 등록, 검색 및 복구의 4가지 서비스로 구성됩니다.
다음 명령으로 작곡가를 사용하여 프로젝트에 라이브러리를 추가할 수 있습니다.
composer require teresko/ palladium
이 패키지를 사용하려면 PHP 버전 7.0+ 및 PDO가 필요합니다.
또한 ID를 저장할 테이블을 생성해야 합니다. 예제 스키마는 여기에서 확인할 수 있습니다. 현재는 MySQL/MariaDB에 대한 테이블 정의만 포함되어 있지만 라이브러리는 PDO 드라이버가 있는 모든 RDBMS와 함께 사용할 수 있습니다.
palladium 에는 Registration
, Identification
, Search
및 Recovery
4가지 서비스가 포함되어 있습니다. 이러한 각 서비스에는 두 가지 필수 종속성이 있습니다.
palladium ContractCanPersistIdenity
구현)PsrLogLoggerInterface
구현)지속성 추상화 계층의 일부를 변경하거나 교체하려는 경우 기본 저장소를 교체할 수 있는 옵션이 제공됩니다. 로거의 경우 권장되는 접근 방식은 Monolog를 사용하는 것이지만 호환되는 모든 로깅 시스템에서 작동합니다.
기본 리포지토리에는 사용자 정의 ID 유형 과 기본 제공 ID 유형에 사용되는 데이터 매퍼를 추가하는 기능도 함께 제공됩니다. 사용법에 대한 자세한 내용은 %TODO% 섹션을 참조하세요.
Identification
서비스 생성자에는 선택적인 세 번째 및 네 번째 매개변수가 있습니다.
Registration
서비스 생성자에는 선택적인 세 번째 매개변수가 있습니다.
위에서 언급했듯이 4개 서비스 모두 저장소를 생성자 종속성으로 기대합니다. 번들 리포지토리를 사용자 지정 버전으로 바꾸지 않는 경우 palladium RepositoryIdentity
초기화하고 서비스에 전달해야 합니다.
번들 저장소 자체에는 palladium ContractCanCreateMapper
구현하는 인스턴스라는 단일 종속성이 있습니다. 이 계약(인터페이스)은 palladium ComponentMapperFactory
에 의해 구현됩니다. 그리고 이 팩토리에는 PDO
인스턴스와 ID가 저장될 테이블 이름이라는 두 가지 종속성이 있습니다.
<?php
$ factory = new palladium Component MapperFactory ( new PDO (... $ config ), $ tableName );
$ repository = new palladium Repository Identity ( $ factory );
$repository
변수가 사용된 것을 볼 수 있는 다른 모든 코드 예제에서는 이 코드 샘플을 사용하여 초기화되었다고 가정할 수 있습니다.
Symfony의 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
인스턴스가 포함됩니다. 확인을 완료하려면 ID에 포함된 토큰을 사용해야 합니다. 주어진 예에서 이 토큰은 $instance->getToken()
사용하여 평가될 수 있습니다.
이메일이 이미 다른 ID에 사용된 경우 createStandardIdentity()
메서드에서 IdentityConflict
예외가 발생할 수 있습니다.
createStandardIdentity()
메소드에는 이메일 확인 토큰의 수명을 초 단위로 정의하는 선택적인 세 번째 매개변수가 있습니다. 적용하면 이전 예제는 다음과 같습니다.
<?php
$ registration = new palladium Service Registration ( $ repository , $ logger );
$ identity = $ registration -> createStandardIdentity ( ' [email protected] ' , ' password ' , 3600 );
$ registration -> bindAccountToIdentity ( $ accountId , $ identity );
이렇게 하면 이 사용자의 신원이 등록된 후 1시간 동안 확인 토큰을 사용할 수 있습니다. 지정된 시간이 지나면 Search
서비스의 findStandardIdentityByToken()
사용하여 이 ID를 찾을 수 없습니다.
중요 :
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
찾는 데 사용되며, 그런 다음 확인됩니다. ID를 찾을 수 없으면 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 );
지정된 식별자(예: 이메일 주소)와 일치하는 ID가 없는 경우 findStandardIdentityByIdentifier()
메서드는 IdentityNotFound
예외를 발생시킵니다.
비밀번호가 일치하지 않는 경우 loginWithPassword()
메소드는 PasswordMismatch
예외를 발생시킵니다.
<?php
$ identity = $ this -> registration -> createNonceIdentity ( $ accountId );
그러면 NonceIdentity
의 새 인스턴스가 생성됩니다. 로그인에 이를 사용하려면 NonceIdentity::getIdentifier()
및 NonceIdentity::getKey()
에 값이 필요합니다. 여기서 식별자는 Nonce ID를 찾는 데 사용되고 키는 확인하는 데 사용됩니다.
createNonceIdentity()
메서드는 이 일회용 ID의 수명을 초 단위로 정의하는 선택적 두 번째 매개변수였습니다. 적용하면 이전 예제는 다음과 같습니다.
<?php
$ identity = $ this -> registration -> createNonceIdentity ( $ accountId , 600 );
이렇게 하면 생성 후 10분 동안 일회용 ID를 사용할 수 있습니다. 허용된 시간이 지난 후 Identification
의 useNonceIdentity()
메서드에 이 ID를 전달하면 IdentityExpired
예외가 발생합니다.
<?php
$ identity = $ this -> search -> findNonceIdentityByIdentifier ( $ identifier );
$ cookie = $ this -> identification -> useNonceIdentity ( $ identity , $ key );
지정된 식별자(이메일 주소, 닉네임 등)와 일치하는 ID가 없으면 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 );
주어진 이메일 주소와 일치하는 ID가 없으면 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 );
이렇게 하면 이 사용자의 ID가 재설정 대상으로 표시된 후 2시간 동안 비밀번호 재설정 토큰을 사용할 수 있습니다. 허용된 시간이 만료되면 Search
서비스에서 findEmailIdentityByToken()
사용하여 이 ID를 찾을 수 없습니다.
<?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 ' );
주어진 토큰과 일치하는 ID가 없으면 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 );
주어진 이메일 주소(또는 다른 유형의 식별자)와 일치하는 ID가 없으면 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
사용자가 손상된 쿠키를 사용하려고 시도한 경우 로깅 사례에만 사용됩니다.
이 라이브러리는 하나의 특정 작업에 중점을 둡니다. 다음 기능은 포함되지 않습니다 .
해당 인증 라이브러리에 위에 나열된 부분 중 하나가 필요하다고 생각한다면 이는 찾고 있는 라이브러리가 아닙니다.