PHP에 대한 인증. 간단하고 가벼우며 안전합니다.
한 번 작성하면 어디서나 사용할 수 있습니다.
프레임워크와 데이터베이스에 완전히 구애받지 않습니다.
pdo
)mysqlnd
) 또는 PostgreSQL 드라이버( pgsql
) 또는 SQLite 드라이버( sqlite
)openssl
)Composer를 통해 라이브러리를 포함합니다 [?]:
$ composer require delight-im/auth
Composer 자동 로더를 포함합니다.
require __DIR__ . ' /vendor/autoload.php ' ;
데이터베이스를 설정하고 필요한 테이블을 만듭니다.
이 프로젝트의 이전 버전에서 마이그레이션하시나요? 도움이 필요하면 업그레이드 가이드를 참조하세요.
// $ db = new PDO ( ' mysql:dbname=my-database ; host = localhost ; charset = utf8mb4' , ' my-username' , ' my-password' ) ;
// or
// $ db = new PDO ( ' pgsql:dbname=my-database ; host = localhost ; port = 5432 ' , ' my-username' , ' my-password' ) ;
// or
// $ db = new PDO ( ' sqlite:../Databases/my-database.sqlite' ) ;
// or
// $ db = Delight D b P doDatabase::fromDsn ( new Delight D b P doDsn ( ' mysql:dbname=my-database ; host = localhost ; charset = utf8mb4' , ' my-username' , ' my-password' ) ) ;
// or
// $ db = Delight D b P doDatabase::fromDsn ( new Delight D b P doDsn ( ' pgsql:dbname=my-database ; host = localhost ; port = 5432 ' , ' my-username' , ' my-password' ) ) ;
// or
// $ db = Delight D b P doDatabase::fromDsn ( new Delight D b P doDsn ( ' sqlite:../Databases/my-database.sqlite' ) ) ;
$ auth = new Delight Auth Auth ( $ db );
이미 열려 있는 PDO
연결이 있는 경우 다시 사용하세요. 데이터베이스 사용자(예: my-username
)에게는 이 라이브러리(또는 상위 데이터베이스)에서 사용하는 테이블에 대해 최소한 SELECT
, INSERT
, UPDATE
및 DELETE
권한이 필요합니다.
웹 서버가 프록시 서버 뒤에 있고 $_SERVER['REMOTE_ADDR']
프록시의 IP 주소만 포함되어 있는 경우 $ipAddress
라는 두 번째 인수의 생성자에 사용자의 실제 IP 주소를 전달해야 합니다. 기본값은 PHP가 수신하는 일반적인 원격 IP 주소입니다.
이 라이브러리의 데이터베이스 테이블에 공통 접두사가 필요한 경우(예: users
대신 my_users
(다른 테이블의 경우에도 마찬가지)) 접두사(예: my_
)를 $dbTablePrefix
라는 생성자의 세 번째 매개변수로 전달합니다. 이는 선택 사항이며 접두사는 기본적으로 비어 있습니다.
개발 중에 이 라이브러리에서 수행되는 요청 제한 또는 조절을 비활성화할 수 있습니다. 이렇게 하려면 $throttling
이라는 네 번째 인수로 생성자에 false
전달합니다. 이 기능은 기본적으로 활성화되어 있습니다.
세션 수명 동안 일부 사용자 데이터는 다른 세션의 클라이언트나 관리자에 의해 원격으로 변경될 수 있습니다. 이는 이 정보가 데이터베이스의 신뢰할 수 있는 소스와 정기적으로 재동기화되어야 함을 의미하며, 이 라이브러리는 자동으로 이를 수행합니다. 기본적으로 이 작업은 5분마다 발생합니다. 이 간격을 변경하려면 사용자 지정 간격(초)을 $sessionResyncInterval
이라는 다섯 번째 인수로 생성자에 전달합니다.
모든 데이터베이스 테이블에 공통 데이터베이스 이름, 스키마 이름 또는 명시적으로 지정해야 하는 기타 한정자가 필요한 경우 선택적으로 해당 한정자를 $dbSchema
라는 여섯 번째 매개변수로 생성자에 전달할 수 있습니다.
PdoDatabase
인스턴스(예: $db
)를 독립적으로 사용하려면 데이터베이스 라이브러리 설명서를 참조하세요.
try {
$ userId = $ auth -> register ( $ _POST [ ' email ' ], $ _POST [ ' password ' ], $ _POST [ ' username ' ], function ( $ selector , $ token ) {
echo ' Send ' . $ selector . ' and ' . $ token . ' to the user (e.g. via email) ' ;
echo ' For emails, consider using the mail(...) function, Symfony Mailer, Swiftmailer, PHPMailer, etc. ' ;
echo ' For SMS, consider using a third-party service and a compatible SDK ' ;
});
echo ' We have signed up a new user with the ID ' . $ userId ;
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Invalid email address ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password ' );
}
catch ( Delight Auth UserAlreadyExistsException $ e ) {
die ( ' User already exists ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
참고: 익명 콜백 함수는 클로저입니다. 따라서 자체 매개변수 외에 $_GET
, $_POST
, $_COOKIE
및 $_SERVER
와 같은 슈퍼전역만 내부에서 사용할 수 있습니다. 상위 범위의 다른 변수의 경우 매개변수 목록 뒤에 use
절을 추가하여 내부에서 복사본을 명시적으로 만들어야 합니다.
세 번째 매개변수의 사용자 이름은 선택사항입니다. 사용자 이름을 관리하지 않으려면 거기에 null
전달할 수 있습니다.
반면에 고유한 사용자 이름을 적용하려면 단순히 register
대신에 registerWithUniqueUsername
호출하고 DuplicateUsernameException
을 포착할 준비를 하십시오.
참고: 사용자 이름을 수락하고 관리할 때 문자 클래스 [x00-x1fx7f/:\]
와 같이 인쇄할 수 없는 제어 문자와 인쇄 가능한 특정 특수 문자를 제외할 수 있습니다. 이를 위해 조건부 분기 내에서 Auth#register
또는 Auth#registerWithUniqueUsername
에 대한 호출을 래핑할 수 있습니다. 예를 들어 다음 조건이 충족되는 경우에만 사용자 이름을 허용합니다.
if ( preg_match ( ' /[x00-x1fx7f/: \\ ]/ ' , $ username ) === 0 ) {
// ...
}
이메일 확인을 위해서는 선택기와 토큰을 사용하여 URL을 작성하고 이를 사용자에게 보내야 합니다. 예:
$ url = ' https://www.example.com/verify_email?selector= ' . urlencode ( $ selector ) . ' &token= ' . urlencode ( $ token );
이메일 확인을 수행하지 않으려면 Auth#register
의 마지막 매개변수, 즉 익명 함수 또는 클로저를 생략하세요. 그러면 새 사용자가 즉시 활성화됩니다.
추가 사용자 정보를 저장해야 합니까? 여기를 읽어보세요.
참고: 사용자에게 이메일을 보낼 때 (선택 사항) 사용자 이름이 아직 (새) 이메일 주소의 소유자가 허용하는 것으로 확인되지 않았다는 점에 유의하세요. 실제로 주소의 소유자가 아닌 사람이 선택한 공격적이거나 오해의 소지가 있는 언어가 포함될 수 있습니다.
try {
$ auth -> login ( $ _POST [ ' email ' ], $ _POST [ ' password ' ]);
echo ' User is logged in ' ;
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Wrong email address ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Wrong password ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Email not verified ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
반면에 이메일 주소를 통한 로그인에 추가로 또는 대체 로그인을 통해 사용자 이름으로 로그인하려는 경우에도 가능합니다. login
메소드 대신 loginWithUsername
메소드를 호출하기만 하면 됩니다. 그런 다음 InvalidEmailException
포착하는 대신 UnknownUsernameException
및 AmbiguousUsernameException
모두 포착해야 합니다. 새로운 사용자를 등록하는 방법을 설명하는 섹션에서 사용자 이름의 고유성에 대한 참고 사항을 읽어 볼 수도 있습니다.
사용자가 확인 이메일에서 클릭한 URL에서 선택기와 토큰을 추출합니다.
try {
$ auth -> confirmEmail ( $ _GET [ ' selector ' ], $ _GET [ ' token ' ]);
echo ' Email address has been verified ' ;
}
catch ( Delight Auth InvalidSelectorTokenPairException $ e ) {
die ( ' Invalid token ' );
}
catch ( Delight Auth TokenExpiredException $ e ) {
die ( ' Token expired ' );
}
catch ( Delight Auth UserAlreadyExistsException $ e ) {
die ( ' Email address already exists ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
성공적으로 확인된 후 사용자가 자동으로 로그인되도록 하려면 confirmEmail
대신 confirmEmailAndSignIn
호출하면 됩니다. 이 대체 방법은 선택적 세 번째 매개변수를 통해 영구 로그인도 지원합니다.
성공하면 confirmEmail
및 confirmEmailAndSignIn
두 메소드 모두 방금 확인된 사용자의 새 이메일 주소가 포함된 배열을 인덱스 1에 반환합니다. 단순한 주소 확인이 아닌 주소 변경에 대한 확인인 경우 사용자의 이전 이메일 주소는 배열의 인덱스 0에 포함됩니다.
Auth#login
및 Auth#confirmEmailAndSignIn
메소드에 대한 세 번째 매개변수는 로그인이 수명이 긴 쿠키로 지속되는지 여부를 제어합니다. 이러한 영구 로그인을 사용하면 브라우저 세션이 이미 닫히고 세션 쿠키가 만료된 경우에도 사용자는 오랫동안 인증 상태를 유지할 수 있습니다. 일반적으로 "기억하기" 또는 "로그인 유지"라고 하는 이 기능을 사용하면 몇 주 또는 몇 달 동안 사용자의 로그인 상태를 유지하려고 할 것입니다. 많은 사용자는 이 방법이 더 편리하다고 생각하지만 장치를 방치하면 보안이 덜해질 수 있습니다.
if ( $ _POST [ ' remember ' ] == 1 ) {
// keep logged in for one year
$ rememberDuration = ( int ) ( 60 * 60 * 24 * 365.25 );
}
else {
// do not keep logged in after session ends
$ rememberDuration = null ;
}
// ...
$ auth -> login ( $ _POST [ ' email ' ], $ _POST [ ' password ' ], $ rememberDuration );
// . . .
기본 동작인 영구 로그인이 없으면 사용자는 브라우저를 닫을 때까지 또는 PHP에서 session.cookie_lifetime
및 session.gc_maxlifetime
통해 구성된 동안에만 로그인 상태를 유지합니다.
세 번째 매개변수를 생략하거나 null
로 설정하여 기능을 비활성화합니다. 그렇지 않으면 사용자에게 "기억하기"를 활성화할지 여부를 물어볼 수 있습니다. 이는 일반적으로 사용자 인터페이스의 확인란을 통해 수행됩니다. 해당 확인란의 입력을 사용하여 여기에서 null
과 미리 정의된 기간(초) 중에서 결정합니다(예: 1년 동안 60 * 60 * 24 * 365.25
.
try {
$ auth -> forgotPassword ( $ _POST [ ' email ' ], function ( $ selector , $ token ) {
echo ' Send ' . $ selector . ' and ' . $ token . ' to the user (e.g. via email) ' ;
echo ' For emails, consider using the mail(...) function, Symfony Mailer, Swiftmailer, PHPMailer, etc. ' ;
echo ' For SMS, consider using a third-party service and a compatible SDK ' ;
});
echo ' Request has been generated ' ;
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Invalid email address ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Email not verified ' );
}
catch ( Delight Auth ResetDisabledException $ e ) {
die ( ' Password reset is disabled ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
참고: 익명 콜백 함수는 클로저입니다. 따라서 자체 매개변수 외에 $_GET
, $_POST
, $_COOKIE
및 $_SERVER
와 같은 슈퍼전역만 내부에서 사용할 수 있습니다. 상위 범위의 다른 변수의 경우 매개변수 목록 뒤에 use
절을 추가하여 내부에서 복사본을 명시적으로 만들어야 합니다.
선택기와 토큰을 사용하여 URL을 작성하고 이를 사용자에게 보내야 합니다. 예:
$ url = ' https://www.example.com/reset_password?selector= ' . urlencode ( $ selector ) . ' &token= ' . urlencode ( $ token );
비밀번호 재설정 요청의 기본 수명이 작동하지 않는 경우 Auth#forgotPassword
의 세 번째 매개변수를 사용하여 요청이 만료되어야 하는 사용자 정의 간격(초)을 지정할 수 있습니다.
다음 단계로 사용자는 받은 링크를 클릭합니다. URL에서 선택기와 토큰을 추출합니다.
선택기/토큰 쌍이 유효한 경우 사용자가 새 비밀번호를 선택하도록 합니다.
try {
$ auth -> canResetPasswordOrThrow ( $ _GET [ ' selector ' ], $ _GET [ ' token ' ]);
echo ' Put the selector into a "hidden" field (or keep it in the URL) ' ;
echo ' Put the token into a "hidden" field (or keep it in the URL) ' ;
echo ' Ask the user for their new password ' ;
}
catch ( Delight Auth InvalidSelectorTokenPairException $ e ) {
die ( ' Invalid token ' );
}
catch ( Delight Auth TokenExpiredException $ e ) {
die ( ' Token expired ' );
}
catch ( Delight Auth ResetDisabledException $ e ) {
die ( ' Password reset is disabled ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
또는 오류 메시지가 필요하지 않고 유효성만 확인하려는 경우 약간 더 간단한 버전을 사용할 수 있습니다.
if ( $ auth -> canResetPassword ( $ _GET [ ' selector ' ], $ _GET [ ' token ' ])) {
echo ' Put the selector into a "hidden" field (or keep it in the URL) ' ;
echo ' Put the token into a "hidden" field (or keep it in the URL) ' ;
echo ' Ask the user for their new password ' ;
}
이제 사용자의 새 비밀번호가 있고 나머지 두 가지 정보도 남아 있으면 비밀번호를 재설정할 수 있습니다.
try {
$ auth -> resetPassword ( $ _POST [ ' selector ' ], $ _POST [ ' token ' ], $ _POST [ ' password ' ]);
echo ' Password has been reset ' ;
}
catch ( Delight Auth InvalidSelectorTokenPairException $ e ) {
die ( ' Invalid token ' );
}
catch ( Delight Auth TokenExpiredException $ e ) {
die ( ' Token expired ' );
}
catch ( Delight Auth ResetDisabledException $ e ) {
die ( ' Password reset is disabled ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
비밀번호 재설정이 성공하면 해당 사용자가 자동으로 로그인되도록 하시겠습니까? Auth#resetPasswordAndSignIn
resetPassword 대신 Auth#resetPassword
을 사용하면 사용자가 즉시 로그인됩니다.
사용자의 ID나 이메일 주소가 필요한 경우(예: 비밀번호가 성공적으로 재설정되었다는 알림을 보내기 위해) id
및 email
이라는 두 개의 항목이 포함된 배열인 Auth#resetPassword
의 반환 값을 사용하세요.
사용자가 현재 로그인되어 있는 경우 비밀번호를 변경할 수 있습니다.
try {
$ auth -> changePassword ( $ _POST [ ' oldPassword ' ], $ _POST [ ' newPassword ' ]);
echo ' Password has been changed ' ;
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' Not logged in ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password(s) ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
사용자에게 현재(및 곧 이전 ) 비밀번호를 묻고 확인을 위해 이를 요구하는 것은 비밀번호 변경을 처리하는 데 권장되는 방법입니다. 이는 위에 표시되어 있습니다.
그러나 해당 확인이 필요하지 않다고 확신하는 경우에는 changePassword
대신 changePasswordWithoutOldPassword
를 호출하고 해당 메소드 호출에서 첫 번째 매개변수를 삭제할 수 있습니다(그렇지 않으면 이전 비밀번호가 포함됨).
어떤 경우든 사용자의 비밀번호가 변경된 후에는 계정 소유자에게 이 중요한 변경 사항을 알리는 대역 외 알림 이메일을 해당 계정의 기본 이메일 주소로 보내야 합니다.
사용자가 현재 로그인되어 있는 경우 이메일 주소를 변경할 수 있습니다.
try {
if ( $ auth -> reconfirmPassword ( $ _POST [ ' password ' ])) {
$ auth -> changeEmail ( $ _POST [ ' newEmail ' ], function ( $ selector , $ token ) {
echo ' Send ' . $ selector . ' and ' . $ token . ' to the user (e.g. via email to the *new* address) ' ;
echo ' For emails, consider using the mail(...) function, Symfony Mailer, Swiftmailer, PHPMailer, etc. ' ;
echo ' For SMS, consider using a third-party service and a compatible SDK ' ;
});
echo ' The change will take effect as soon as the new email address has been confirmed ' ;
}
else {
echo ' We can ' t say if the user is who they claim to be ' ;
}
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Invalid email address ' );
}
catch ( Delight Auth UserAlreadyExistsException $ e ) {
die ( ' Email address already exists ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Account not verified ' );
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' Not logged in ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
참고: 익명 콜백 함수는 클로저입니다. 따라서 자체 매개변수 외에 $_GET
, $_POST
, $_COOKIE
및 $_SERVER
와 같은 슈퍼전역만 내부에서 사용할 수 있습니다. 상위 범위의 다른 변수의 경우 매개변수 목록 뒤에 use
절을 추가하여 내부에서 복사본을 명시적으로 만들어야 합니다.
이메일 확인을 위해서는 선택기와 토큰을 사용하여 URL을 작성하고 이를 사용자에게 보내야 합니다. 예:
$ url = ' https://www.example.com/verify_email?selector= ' . urlencode ( $ selector ) . ' &token= ' . urlencode ( $ token );
참고: 사용자에게 이메일을 보낼 때 (선택 사항) 사용자 이름이 아직 (새) 이메일 주소의 소유자가 허용하는 것으로 확인되지 않았다는 점에 유의하세요. 실제로 주소의 소유자가 아닌 사람이 선택한 공격적이거나 오해의 소지가 있는 언어가 포함될 수 있습니다.
이메일 주소 변경 요청이 이루어진 후 또는 사용자가 변경 사항을 확인한 후에는 계정 소유자에게 다음 사항을 알리는 대역 외 알림으로 계정의 이전 이메일 주소로 이메일을 보내야 합니다. 이 중요한 변화.
참고: 사용자의 이메일 주소에 대한 변경 사항은 예상대로 로컬 세션에 즉시 적용됩니다. 그러나 다른 세션(예: 다른 장치)에서는 변경 사항이 적용되는 데 최대 5분이 걸릴 수 있습니다. 이렇게 하면 성능이 향상되고 일반적으로 문제가 발생하지 않습니다. 그럼에도 불구하고 이 동작을 변경하려면 Auth
생성자에 $sessionResyncInterval
이라는 인수로 전달하는 값을 줄이거나 늘리면 됩니다.
이전 확인 요청을 사용자에게 전달할 수 없는 경우, 사용자가 해당 요청을 놓친 경우 또는 더 이상 기다리고 싶지 않은 경우 다음과 같이 이전 요청을 다시 보낼 수 있습니다.
try {
$ auth -> resendConfirmationForEmail ( $ _POST [ ' email ' ], function ( $ selector , $ token ) {
echo ' Send ' . $ selector . ' and ' . $ token . ' to the user (e.g. via email) ' ;
echo ' For emails, consider using the mail(...) function, Symfony Mailer, Swiftmailer, PHPMailer, etc. ' ;
echo ' For SMS, consider using a third-party service and a compatible SDK ' ;
});
echo ' The user may now respond to the confirmation request (usually by clicking a link) ' ;
}
catch ( Delight Auth ConfirmationRequestNotFound $ e ) {
die ( ' No earlier request found that could be re-sent ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' There have been too many requests -- try again later ' );
}
이메일 주소 대신 ID로 사용자를 지정하려는 경우에도 가능합니다.
try {
$ auth -> resendConfirmationForUserId ( $ _POST [ ' userId ' ], function ( $ selector , $ token ) {
echo ' Send ' . $ selector . ' and ' . $ token . ' to the user (e.g. via email) ' ;
echo ' For emails, consider using the mail(...) function, Symfony Mailer, Swiftmailer, PHPMailer, etc. ' ;
echo ' For SMS, consider using a third-party service and a compatible SDK ' ;
});
echo ' The user may now respond to the confirmation request (usually by clicking a link) ' ;
}
catch ( Delight Auth ConfirmationRequestNotFound $ e ) {
die ( ' No earlier request found that could be re-sent ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' There have been too many requests -- try again later ' );
}
참고: 익명 콜백 함수는 클로저입니다. 따라서 자체 매개변수 외에 $_GET
, $_POST
, $_COOKIE
및 $_SERVER
와 같은 슈퍼전역만 내부에서 사용할 수 있습니다. 상위 범위의 다른 변수의 경우 매개변수 목록 뒤에 use
절을 추가하여 내부에서 복사본을 명시적으로 만들어야 합니다.
일반적으로 선택기와 토큰을 사용하여 URL을 작성하고 이를 사용자에게 보내야 합니다. 예를 들면 다음과 같습니다.
$ url = ' https://www.example.com/verify_email?selector= ' . urlencode ( $ selector ) . ' &token= ' . urlencode ( $ token );
참고: 사용자에게 이메일을 보낼 때 (선택 사항) 사용자 이름이 아직 (새) 이메일 주소의 소유자가 허용하는 것으로 확인되지 않았다는 점에 유의하세요. 실제로 주소의 소유자가 아닌 사람이 선택한 공격적이거나 오해의 소지가 있는 언어가 포함될 수 있습니다.
$ auth -> logOut ();
// or
try {
$ auth -> logOutEverywhereElse ();
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' Not logged in ' );
}
// or
try {
$ auth -> logOutEverywhere ();
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' Not logged in ' );
}
또한 세션에 사용자 지정 정보도 저장하고 해당 정보를 삭제하려는 경우 두 번째 메서드를 호출하여 전체 세션을 삭제할 수 있습니다.
$ auth -> destroySession ();
참고: 글로벌 로그아웃은 예상대로 로컬 세션에 즉시 적용됩니다. 그러나 다른 세션(예: 다른 장치)에서는 변경 사항이 적용되는 데 최대 5분이 걸릴 수 있습니다. 이렇게 하면 성능이 향상되고 일반적으로 문제가 발생하지 않습니다. 그럼에도 불구하고 이 동작을 변경하려면 Auth
생성자에 $sessionResyncInterval
이라는 인수로 전달하는 값을 줄이거나 늘리면 됩니다.
if ( $ auth -> isLoggedIn ()) {
echo ' User is signed in ' ;
}
else {
echo ' User is not signed in yet ' ;
}
이 메소드의 약어/별칭은 $auth->check()
입니다.
$ id = $ auth -> getUserId ();
사용자가 현재 로그인되어 있지 않으면 null
반환합니다.
이 메소드의 약어/별칭은 $auth->id()
입니다.
$ email = $ auth -> getEmail ();
사용자가 현재 로그인되어 있지 않으면 null
반환합니다.
$ username = $ auth -> getUsername ();
사용자 이름은 선택 사항이며 등록 시 제공한 경우에만 사용자 이름이 있다는 점을 기억하십시오.
사용자가 현재 로그인되어 있지 않으면 null
반환합니다.
if ( $ auth -> isNormal ()) {
echo ' User is in default state ' ;
}
if ( $ auth -> isArchived ()) {
echo ' User has been archived ' ;
}
if ( $ auth -> isBanned ()) {
echo ' User has been banned ' ;
}
if ( $ auth -> isLocked ()) {
echo ' User has been locked ' ;
}
if ( $ auth -> isPendingReview ()) {
echo ' User is pending review ' ;
}
if ( $ auth -> isSuspended ()) {
echo ' User has been suspended ' ;
}
if ( $ auth -> isRemembered ()) {
echo ' User did not sign in but was logged in through their long-lived cookie ' ;
}
else {
echo ' User signed in manually ' ;
}
사용자가 현재 로그인되어 있지 않으면 null
반환합니다.
$ ip = $ auth -> getIpAddress ();
모든 목적에 대한 이 라이브러리의 적합성과 완전한 재사용성을 유지하기 위해 사용자 정보에 대한 추가 번들 열이 제공되지 않습니다. 그러나 물론 추가 사용자 정보 없이는 할 수 없습니다.
유지 관리 및 재사용이 가능한 방식으로 사용자 정의 사용자 정보를 위한 자체 테이블과 함께 이 라이브러리를 사용하는 방법은 다음과 같습니다.
사용자 정의 사용자 정보를 저장하는 사용자 정의 데이터베이스 테이블(예: profiles
이라는 테이블)을 원하는 수만큼 추가하세요.
새로운 사용자의 ID를 반환하는 register
메소드를 호출할 때마다 나중에 사용자 정의 데이터베이스 테이블을 채우는 자체 로직을 추가하십시오.
사용자 정의 사용자 정보가 거의 필요하지 않은 경우 필요에 따라 검색하면 됩니다. 그러나 더 자주 필요한 경우에는 세션 데이터에 저장하는 것이 좋습니다. 다음 방법은 안정적인 방식으로 데이터를 로드하고 액세스할 수 있는 방법입니다.
function getUserInfo ( Delight Auth Auth $ auth ) {
if (! $ auth -> isLoggedIn ()) {
return null ;
}
if (! isset ( $ _SESSION [ ' _internal_user_info ' ])) {
// TODO : load your custom user information and assign it to the session variable below
// $ _SESSION [ ' _internal_user_info' ] = ...
}
return $ _SESSION [ ' _internal_user_info ' ];
}
사용자의 신원을 다시 확인하고 싶을 때마다(예: 사용자가 "위험한" 작업을 수행하도록 허용되기 전) 암호를 다시 확인하여 실제로 자신이 주장하는 사람인지 확인해야 합니다.
예를 들어 사용자가 수명이 긴 쿠키에 의해 기억되어 Auth#isRemembered
true
반환하는 경우 이는 사용자가 꽤 오랫동안 비밀번호를 입력하지 않았을 가능성이 높다는 의미입니다. 이 경우 비밀번호를 다시 확인하는 것이 좋습니다.
try {
if ( $ auth -> reconfirmPassword ( $ _POST [ ' password ' ])) {
echo ' The user really seems to be who they claim to be ' ;
}
else {
echo ' We can ' t say if the user is who they claim to be ' ;
}
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' The user is not signed in ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
모든 사용자는 권한 부여를 구현하고 액세스 제어를 구체화하는 데 사용할 수 있는 역할을 제한 없이 가질 수 있습니다.
사용자는 역할이 전혀 없거나(기본적으로 수행됨), 정확히 하나의 역할을 가질 수도 있고, 임의의 역할 조합을 가질 수도 있습니다.
if ( $ auth -> hasRole ( Delight Auth Role:: SUPER_MODERATOR )) {
echo ' The user is a super moderator ' ;
}
// or
if ( $ auth -> hasAnyRole ( Delight Auth Role:: DEVELOPER , Delight Auth Role:: MANAGER )) {
echo ' The user is either a developer, or a manager, or both ' ;
}
// or
if ( $ auth -> hasAllRoles ( Delight Auth Role:: DEVELOPER , Delight Auth Role:: MANAGER )) {
echo ' The user is both a developer and a manager ' ;
}
hasRole
메소드는 인수로 정확히 하나의 역할을 취하는 반면, hasAnyRole
및 hasAllRoles
두 메소드는 확인하려는 역할을 원하는 수만큼 취할 수 있습니다.
또는 사용자에게 할당된 모든 역할 목록을 가져올 수 있습니다.
$ auth -> getRoles ();
Delight Auth Role:: ADMIN ;
Delight Auth Role:: AUTHOR ;
Delight Auth Role:: COLLABORATOR ;
Delight Auth Role:: CONSULTANT ;
Delight Auth Role:: CONSUMER ;
Delight Auth Role:: CONTRIBUTOR ;
Delight Auth Role:: COORDINATOR ;
Delight Auth Role:: CREATOR ;
Delight Auth Role:: DEVELOPER ;
Delight Auth Role:: DIRECTOR ;
Delight Auth Role:: EDITOR ;
Delight Auth Role:: EMPLOYEE ;
Delight Auth Role:: MAINTAINER ;
Delight Auth Role:: MANAGER ;
Delight Auth Role:: MODERATOR ;
Delight Auth Role:: PUBLISHER ;
Delight Auth Role:: REVIEWER ;
Delight Auth Role:: SUBSCRIBER ;
Delight Auth Role:: SUPER_ADMIN ;
Delight Auth Role:: SUPER_EDITOR ;
Delight Auth Role:: SUPER_MODERATOR ;
Delight Auth Role:: TRANSLATOR ;
이러한 역할 중 하나를 사용하고 필요하지 않은 역할은 무시할 수 있습니다. 위 목록은 다음 세 가지 형식 중 하나로 프로그래밍 방식으로 검색할 수도 있습니다.
Delight Auth Role:: getMap ();
// or
Delight Auth Role:: getNames ();
// or
Delight Auth Role:: getValues ();
각 사용자의 권한은 코드 베이스 전체에서 역할 요구 사항이 지정되는 방식으로 인코딩됩니다. 특정 사용자의 역할 집합을 사용하여 이러한 요구 사항을 평가하면 암시적으로 확인된 권한이 결과로 나타납니다.
대규모 프로젝트의 경우 권한 정의를 한곳에 유지하는 것이 권장되는 경우가 많습니다. 그런 다음 비즈니스 로직에서 역할을 확인하지 않고 개별 권한 을 확인합니다. 해당 개념을 다음과 같이 구현할 수 있습니다.
function canEditArticle ( Delight Auth Auth $ auth ) {
return $ auth -> hasAnyRole (
Delight Auth Role:: MODERATOR ,
Delight Auth Role:: SUPER_MODERATOR ,
Delight Auth Role:: ADMIN ,
Delight Auth Role:: SUPER_ADMIN
);
}
// . . .
if ( canEditArticle ( $ auth )) {
echo ' The user can edit articles here ' ;
}
// . . .
if ( canEditArticle ( $ auth )) {
echo ' ... and here ' ;
}
// . . .
if ( canEditArticle ( $ auth )) {
echo ' ... and here ' ;
}
보시다시피 특정 사용자가 기사를 편집할 수 있는지 여부에 대한 권한은 중앙 위치에 저장됩니다. 이 구현에는 두 가지 주요 이점이 있습니다.
어떤 사용자가 기사를 편집할 수 있는지 알고 싶다면 여러 곳에서 비즈니스 로직을 확인할 필요가 없고 특정 권한이 정의된 위치만 보면 됩니다. 그리고 기사를 편집할 수 있는 사람을 변경 하려면 전체 코드 베이스가 아닌 한 곳에서만 변경하면 됩니다.
그러나 처음으로 액세스 제한을 구현할 때 약간 더 많은 오버헤드가 발생하므로 프로젝트에 가치가 있을 수도 있고 그렇지 않을 수도 있습니다.
포함된 역할의 이름이 적합하지 않은 경우 다음과 같이 자신의 식별자를 사용하여 여러 역할에 별칭을 지정할 수 있습니다.
namespace My Namespace ;
final class MyRole {
const CUSTOMER_SERVICE_AGENT = Delight Auth Role:: REVIEWER ;
const FINANCIAL_DIRECTOR = Delight Auth Role:: COORDINATOR ;
private function __construct () {}
}
위의 예를 사용하면 다음을 사용할 수 있습니다.
My Namespace MyRole:: CUSTOMER_SERVICE_AGENT ;
// and
My Namespace MyRole:: FINANCIAL_DIRECTOR ;
대신에
Delight Auth Role:: REVIEWER ;
// and
Delight Auth Role:: COORDINATOR ;
포함된 단일 역할을 사용자 지정 이름을 사용하여 여러 역할에 별칭을 지정 하지 마세요.
이메일을 통한 비밀번호 재설정은 대부분의 사용자가 때때로 유용하다고 생각하는 편리한 기능이지만, 이 기능의 사용 가능 여부는 귀하의 서비스 계정이 사용자와 연결된 이메일 계정만큼만 안전하다는 것을 의미합니다.
보안에 민감한(그리고 숙련된) 사용자에게 보안 강화를 위해 계정의 비밀번호 재설정을 비활성화하고 나중에 다시 활성화할 수 있는 기능을 제공할 수 있습니다.
try {
if ( $ auth -> reconfirmPassword ( $ _POST [ ' password ' ])) {
$ auth -> setPasswordResetEnabled ( $ _POST [ ' enabled ' ] == 1 );
echo ' The setting has been changed ' ;
}
else {
echo ' We can ' t say if the user is who they claim to be ' ;
}
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' The user is not signed in ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
이 설정의 현재 값을 확인하려면 다음의 반환 값을 사용하십시오.
$ auth -> isPasswordResetEnabled ();
사용자 인터페이스의 올바른 기본 옵션을 확인하세요. 자동으로 적용되는 기능 제한에 대해서는 이 값을 확인할 필요가 없습니다.
이 라이브러리에서 제공하는 모든 메서드는 클라이언트의 과도한 요청으로부터 자동으로 보호됩니다. 필요한 경우 생성자에 전달된 $throttling
매개변수를 사용하여 이 보호를 (일시적으로) 비활성화할 수 있습니다.
외부 기능이나 메서드(예: 자신의 코드에 있는 기능)도 조절하거나 속도 제한하려는 경우 조절 및 속도 제한을 위해 내장된 도우미 메서드를 사용할 수 있습니다.
try {
// throttle the specified resource or feature to * 3 * requests per * 60 * seconds
$ auth -> throttle ([ ' my-resource-name ' ], 3 , 60 );
echo ' Do something with the resource or feature ' ;
}
catch ( Delight Auth TooManyRequestsException $ e ) {
// operation cancelled
http_response_code ( 429 );
exit ;
}
리소스나 기능의 보호가 다른 속성에 추가로 의존해야 하는 경우(예: IP 주소별로 개별적으로 추적하기 위해) 리소스 설명에 다음과 같은 데이터를 더 추가하면 됩니다.
[ ' my-resource-name ' , $ _SERVER [ ' REMOTE_ADDR ' ] ]
// instead of
// [ ' my-resource-name' ]
버스트 요인을 네 번째 인수로 지정하면 최대 수요 동안 짧은 활동 버스트를 허용할 수 있습니다. 예를 들어 값 5
는 일반적으로 허용되는 수준과 비교하여 5배 활동의 일시적인 버스트를 허용합니다.
경우에 따라 조절이나 속도 제한만 시뮬레이션 하고 싶을 수도 있습니다. 이를 통해 활동 추적기를 실제로 수정하지 않고도 작업이 허용되는지 여부를 확인할 수 있습니다. 그렇게 하려면 다섯 번째 인수로 true
전달하면 됩니다.
참고: 인스턴스에서 조절을 비활성화하면(생성자에 전달된 $throttling
매개 변수 사용) 자동 내부 보호와 자체 애플리케이션 코드에서 Auth#throttle
호출의 효과가 모두 꺼집니다. 특정 Auth#throttle
호출에서 선택적 $force
매개변수를 true
로 설정합니다.
관리 인터페이스는 $auth->admin()
을 통해 사용할 수 있습니다. 아래 설명된 대로 이 인터페이스에서 다양한 메서드를 호출할 수 있습니다.
이 인터페이스에 대한 액세스를 노출하기 전에 보안 액세스 제어를 구현하는 것을 잊지 마십시오. 예를 들어 관리자 역할로 로그인한 사용자에게만 이 인터페이스에 대한 액세스 권한을 제공하거나 개인 스크립트에서만 인터페이스를 사용할 수 있습니다.
try {
$ userId = $ auth -> admin ()-> createUser ( $ _POST [ ' email ' ], $ _POST [ ' password ' ], $ _POST [ ' username ' ]);
echo ' We have signed up a new user with the ID ' . $ userId ;
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Invalid email address ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password ' );
}
catch ( Delight Auth UserAlreadyExistsException $ e ) {
die ( ' User already exists ' );
}
세 번째 매개변수의 사용자 이름은 선택사항입니다. 사용자 이름을 관리하지 않으려면 거기에 null
전달할 수 있습니다.
반면에 고유한 사용자 이름을 적용하려면 createUser
대신 createUserWithUniqueUsername
호출하고 DuplicateUsernameException
을 포착할 준비를 하세요.
ID로 사용자 삭제:
try {
$ auth -> admin ()-> deleteUserById ( $ _POST [ ' id ' ]);
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown ID ' );
}
이메일 주소로 사용자 삭제:
try {
$ auth -> admin ()-> deleteUserByEmail ( $ _POST [ ' email ' ]);
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Unknown email address ' );
}
사용자 이름으로 사용자 삭제:
try {
$ auth -> admin ()-> deleteUserByUsername ( $ _POST [ ' username ' ]);
}
catch ( Delight Auth UnknownUsernameException $ e ) {
die ( ' Unknown username ' );
}
catch ( Delight Auth AmbiguousUsernameException $ e ) {
die ( ' Ambiguous username ' );
}
모든 사용자 목록을 가져올 때 요구 사항은 프로젝트와 사용 사례에 따라 크게 다르며 사용자 지정이 일반적입니다. 예를 들어, 다른 열을 가져오고, 관련 테이블을 조인하고, 특정 기준으로 필터링하고, 결과 정렬 방법(다양한 방향)을 변경하고, 결과 수를 제한(오프셋 제공)할 수 있습니다.
이것이 바로 단일 사용자 지정 SQL 쿼리를 사용하는 것이 더 쉬운 이유입니다. 다음부터 시작하세요.
SELECT id, email, username, status, verified, roles_mask, registered, last_login FROM users;
try {
$ auth -> admin ()-> addRoleForUserById ( $ userId , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown user ID ' );
}
// or
try {
$ auth -> admin ()-> addRoleForUserByEmail ( $ userEmail , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Unknown email address ' );
}
// or
try {
$ auth -> admin ()-> addRoleForUserByUsername ( $ username , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth UnknownUsernameException $ e ) {
die ( ' Unknown username ' );
}
catch ( Delight Auth AmbiguousUsernameException $ e ) {
die ( ' Ambiguous username ' );
}
참고: 사용자의 역할 집합에 대한 변경 사항이 적용되려면 최대 5분이 걸릴 수 있습니다. 이렇게 하면 성능이 향상되고 일반적으로 문제가 발생하지 않습니다. 그럼에도 불구하고 이 동작을 변경하려면 $sessionResyncInterval
이라는 인수로 Auth
생성자에 전달하는 값을 줄이거나 늘리면 됩니다.
try {
$ auth -> admin ()-> removeRoleForUserById ( $ userId , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown user ID ' );
}
// or
try {
$ auth -> admin ()-> removeRoleForUserByEmail ( $ userEmail , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Unknown email address ' );
}
// or
try {
$ auth -> admin ()-> removeRoleForUserByUsername ( $ username , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth UnknownUsernameException $ e ) {
die ( ' Unknown username ' );
}
catch ( Delight Auth AmbiguousUsernameException $ e ) {
die ( ' Ambiguous username ' );
}
참고: 사용자의 역할 집합에 대한 변경 사항이 적용되려면 최대 5분이 걸릴 수 있습니다. 이렇게 하면 성능이 향상되고 일반적으로 문제가 발생하지 않습니다. 그럼에도 불구하고 이 동작을 변경하려면 $sessionResyncInterval
이라는 인수로 Auth
생성자에 전달하는 값을 줄이거나 늘리면 됩니다.
try {
if ( $ auth -> admin ()-> doesUserHaveRole ( $ userId , Delight Auth Role:: ADMIN )) {
echo ' The specified user is an administrator ' ;
}
else {
echo ' The specified user is not an administrator ' ;
}
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown user ID ' );
}
또는 사용자에게 할당된 모든 역할 목록을 가져올 수 있습니다.
$ auth -> admin ()-> getRolesForUserById ( $ userId );
try {
$ auth -> admin ()-> logInAsUserById ( $ _POST [ ' id ' ]);
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown ID ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Email address not verified ' );
}
// or
try {
$ auth -> admin ()-> logInAsUserByEmail ( $ _POST [ ' email ' ]);
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Unknown email address ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Email address not verified ' );
}
// or
try {
$ auth -> admin ()-> logInAsUserByUsername ( $ _POST [ ' username ' ]);
}
catch ( Delight Auth UnknownUsernameException $ e ) {
die ( ' Unknown username ' );
}
catch ( Delight Auth AmbiguousUsernameException $ e ) {
die ( ' Ambiguous username ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Email address not verified ' );
}
try {
$ auth -> admin ()-> changePasswordForUserById ( $ _POST [ ' id ' ], $ _POST [ ' newPassword ' ]);
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown ID ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password ' );
}
// or
try {
$ auth -> admin ()-> changePasswordForUserByUsername ( $ _POST [ ' username ' ], $ _POST [ ' newPassword ' ]);
}
catch ( Delight Auth UnknownUsernameException $ e ) {
die ( ' Unknown username ' );
}
catch ( Delight Auth AmbiguousUsernameException $ e ) {
die ( ' Ambiguous username ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password ' );
}
이 라이브러리는 두 개의 쿠키를 사용하여 클라이언트의 상태를 유지합니다. 첫 번째 쿠키는 다음을 사용하여 이름을 검색할 수 있습니다.
session_name ();
일반(필수) 세션 쿠키입니다. 두 번째(선택 사항) 쿠키는 영구 로그인에만 사용되며 해당 이름은 다음과 같이 검색할 수 있습니다.
Delight Auth Auth:: createRememberCookieName ();
권장 순서에 따라 다음 방법 중 하나를 통해 이 라이브러리에서 사용하는 세션 쿠키의 이름을 바꿀 수 있습니다.
PHP 구성( php.ini
)에서 다음과 같이 session.name
지시문이 있는 행을 찾아 해당 값을 session_v1
과 같은 값으로 변경합니다.
session.name = session_v1
애플리케이션에서 가능한 한 빨리, Auth
인스턴스를 생성하기 전에 다음과 같이 ini_set
호출하여 session.name
session_v1
과 같은 이름으로 변경하세요.
ini_set ( ' session.name ' , ' session_v1 ' );
이것이 작동하려면 PHP 구성( php.ini
)에서 session.auto_start
0
으로 설정해야 합니다.
애플리케이션에서 가능한 한 빨리, Auth
인스턴스를 생성하기 전에 다음과 같이 session_v1
과 같은 인수를 사용하여 session_name
호출하세요.
session_name ( ' session_v1 ' );
이것이 작동하려면 PHP 구성( php.ini
)에서 session.auto_start
0
으로 설정해야 합니다.
세션 쿠키 이름을 변경하면 영구 로그인을 위한 쿠키 이름도 자동으로 변경됩니다.
쿠키의 domain
속성은 쿠키가 유효한 도메인(및 하위 도메인)과 사용자의 세션 및 인증 상태를 사용할 수 있는 위치를 제어합니다.
권장되는 기본값은 빈 문자열입니다. 이는 쿠키가 존재할 수 있는 하위 도메인을 제외하고 정확한 현재 호스트에 대해서만 유효함을 의미합니다. 서로 다른 하위 도메인 간에 쿠키를 공유해야 하는 경우에만 다른 값을 사용해야 합니다. 기본 도메인과 www
하위 도메인 간에 쿠키를 공유하고 싶은 경우가 많지만, 다른 하위 도메인 집합 간에도 쿠키를 공유하고 싶을 수도 있습니다.
어떤 하위 도메인 세트를 선택하든 필수 하위 도메인을 모두 포함하는 가장 구체적인 도메인 이름으로 쿠키의 속성을 설정해야 합니다. 예를 들어 example.com
과 www.example.com
간에 쿠키를 공유하려면 속성을 example.com
으로 설정합니다. 하지만 sub1.app.example.com
과 sub2.app.example.com
간에 쿠키를 공유하려면 속성을 app.example.com
으로 설정해야 합니다. 명시적으로 지정된 도메인 이름에는 항상 존재할 수 있는 모든 하위 도메인이 포함됩니다 .
권장 순서에 따라 다음 방법 중 하나를 통해 속성을 변경할 수 있습니다.
PHP 구성( php.ini
)에서 session.cookie_domain
지시문이 있는 줄을 찾아 해당 값을 원하는 대로 변경합니다. 예:
session.cookie_domain = example.com
애플리케이션에서 가능한 한 빨리, Auth
인스턴스를 생성하기 전에 ini_set
호출하여 원하는 대로 session.cookie_domain
지시문의 값을 변경하세요. 예:
ini_set ( ' session.cookie_domain ' , ' example.com ' );
이것이 작동하려면 PHP 구성( php.ini
)에서 session.auto_start
0
으로 설정해야 합니다.
쿠키의 path
속성은 쿠키가 유효한 디렉터리(및 하위 디렉터리)와 사용자의 세션 및 인증 상태를 사용할 수 있는 위치를 제어합니다.
대부분의 경우 루트 디렉터리에서 시작하여 모든 경로, 즉 모든 디렉터리 및 파일에 쿠키를 사용할 수 있도록 하려고 합니다. 이는 속성의 /
값이 수행하는 작업이며 권장되는 기본값이기도 합니다. 쿠키를 사용할 수 있는 디렉토리를 제한하려는 경우(예: 여러 애플리케이션을 나란히 호스트하는 경우) 이 속성을 다른 값(예: /path/to/subfolder
)으로 변경해야 합니다. 동일한 도메인 이름.
권장 순서에 따라 다음 방법 중 하나를 통해 속성을 변경할 수 있습니다.
PHP 구성( php.ini
)에서 session.cookie_path
지시문이 있는 줄을 찾아 해당 값을 원하는 대로 변경합니다. 예:
session.cookie_path = /
애플리케이션에서 가능한 한 빨리, Auth
인스턴스를 생성하기 전에 ini_set
호출하여 원하는 대로 session.cookie_path
지시문의 값을 변경하세요. 예:
ini_set ( ' session.cookie_path ' , ' / ' );
이것이 작동하려면 PHP 구성( php.ini
)에서 session.auto_start
0
으로 설정해야 합니다.
httponly
속성을 사용하면 클라이언트측 스크립트, 즉 JavaScript가 쿠키에 액세스할 수 있는지 여부를 제어할 수 있습니다. 보안상의 이유로 쿠키에 대한 스크립트 액세스를 거부하는 것이 가장 좋습니다. 이렇게 하면 예를 들어 애플리케이션에 대한 성공적인 XSS 공격으로 인한 피해를 줄일 수 있습니다.
따라서 실제로 JavaScript에서 쿠키에 액세스해야 하고 더 나은 솔루션을 찾을 수 없는 드문 경우를 제외하고는 항상 httponly
1
로 설정해야 합니다. 이러한 경우 속성을 0
으로 설정하세요. 단, 결과에 유의하세요.
권장 순서에 따라 다음 방법 중 하나를 통해 속성을 변경할 수 있습니다.
PHP 구성( php.ini
)에서 session.cookie_httponly
지시문이 있는 줄을 찾아 해당 값을 원하는 대로 변경합니다. 예:
session.cookie_httponly = 1
애플리케이션에서 가능한 한 빨리, Auth
인스턴스를 생성하기 전에 ini_set
호출하여 원하는 대로 session.cookie_httponly
지시어의 값을 변경하세요. 예:
ini_set ( ' session.cookie_httponly ' , 1 );
이것이 작동하려면 PHP 구성( php.ini
)에서 session.auto_start
0
으로 설정해야 합니다.
secure
속성을 사용하면 일반 HTTP를 포함한 모든 연결을 통해 쿠키를 전송해야 하는지 또는 보안 연결, 즉 HTTPS(SSL/TLS 사용)가 필요한지 여부를 제어할 수 있습니다. 속성을 0
으로 설정하면 전자(덜 안전한) 모드를 선택할 수 있고, 속성을 1
로 설정하면 후자(더 안전한) 모드를 선택할 수 있습니다.
분명히 이것은 전적으로 HTTPS를 통해서만 모든 페이지를 제공할 수 있는지 여부에 달려 있습니다. 가능하다면 속성을 1
로 설정하고 이를 보안 프로토콜 및 HSTS(HTTP Strict Transport Security)에 대한 HTTP 리디렉션과 결합해야 합니다. 그렇지 않으면 속성을 0
으로 설정해야 할 수도 있습니다.
권장 순서에 따라 다음 방법 중 하나를 통해 속성을 변경할 수 있습니다.
PHP 구성( php.ini
)에서 session.cookie_secure
지시문이 있는 줄을 찾아 해당 값을 원하는 대로 변경합니다. 예:
session.cookie_secure = 1
애플리케이션에서 가능한 빨리, Auth
인스턴스를 생성하기 전에 ini_set
호출하여 원하는 대로 session.cookie_secure
지시문의 값을 변경하세요. 예:
ini_set ( ' session.cookie_secure ' , 1 );
이것이 작동하려면 PHP 구성( php.ini
)에서 session.auto_start
0
으로 설정해야 합니다.
$ length = 24 ;
$ randomStr = Delight Auth Auth:: createRandomString ( $ length );
$ uuid = Delight Auth Auth:: createUuid ();
세션 데이터를 편리하게 읽고 쓰는 방법에 대한 자세한 내용은 기본으로 포함되어 있는 세션 라이브러리의 설명서를 참조하세요.
모든 비밀번호 또는 인증 토큰은 "Blowfish" 암호를 기반으로 하며 (여전히) 오늘날 가장 강력한 비밀번호 해시 기능 중 하나로 간주되는 "bcrypt" 기능을 사용하여 자동으로 해시됩니다. "bcrypt"는 1,024번의 반복, 즉 "비용" 요소 10으로 사용됩니다. 무작위 "소금"도 자동으로 적용됩니다.
데이터베이스 테이블 users
의 해시를 보면 이 구성을 확인할 수 있습니다. 위의 설정이 사실이라면 users
테이블의 모든 비밀번호 해시는 $2$10$
, $2a$10$
또는 $2y$10$
접두사로 시작해야 합니다.
향후 새로운 알고리즘(예: Argon2)이 도입될 경우 이 라이브러리는 사용자가 로그인하거나 비밀번호를 변경할 때마다 기존 비밀번호 해시를 자동으로 "업그레이드"합니다.
일반적으로 비밀번호의 최소 길이를 적용하는 것이 좋습니다. 그 외에도 사전 단어나 일반적으로 사용되는 비밀번호가 애플리케이션에서 사용되는 것을 방지하기 위해 잠재적인 비밀번호가 데이터베이스나 파일에서 관리할 수 있는 일부 블랙리스트에 있는지 조회할 수 있습니다.
최대의 유연성과 사용 편의성을 허용하기 위해 이 라이브러리는 비밀번호 요구 사항 자체에 대한 추가 검사를 포함하지 않고 대신 라이브러리 메서드에 대한 관련 호출에 대해 자체 검사를 래핑할 수 있도록 설계되었습니다. 예:
function isPasswordAllowed ( $ password ) {
if ( strlen ( $ password ) < 8 ) {
return false ;
}
$ blacklist = [ ' password1 ' , ' 123456 ' , ' qwerty ' ];
if ( in_array ( $ password , $ blacklist )) {
return false ;
}
return true ;
}
if ( isPasswordAllowed ( $ password )) {
$ auth -> register ( $ email , $ password );
}
다른 라이브러리를 로드하기 전에 먼저 이 라이브러리를 로드하고 Auth
인스턴스를 먼저 생성해 볼 수 있습니다. 그 외에도 여기서 우리가 할 수 있는 일은 많지 않을 것입니다.
다른 사람이 귀하의 사이트를 <frame>
, <iframe>
, <object>
, <embed>
또는 <applet>
요소에 포함하도록 하려면 기본 클릭재킹 방지를 비활성화해야 합니다.
header_remove ( ' X-Frame-Options ' );
이 라이브러리는 문제를 나타내기 위해 두 가지 유형의 예외를 발생시킵니다.
AuthException
및 해당 하위 클래스는 메서드가 성공적으로 완료되지 않을 때마다 발생합니다. 이러한 예외는 사용자가 대응해야 하는 일반적인 오류 응답을 전달하므로 항상 이러한 예외를 포착해야 합니다.AuthError
및 그 하위 클래스는 내부 문제가 있거나 라이브러리가 올바르게 설치되지 않을 때마다 발생합니다. 이러한 예외를 포착해서는 안 됩니다. 모든 기여를 환영합니다! 기여하고 싶다면 먼저 문제를 만들어 기능, 문제 또는 질문에 대해 논의 할 수 있습니다.
이 프로젝트는 MIT 라이센스의 조건에 따라 라이센스가 부여됩니다.