Otentikasi untuk PHP. Sederhana, ringan dan aman.
Ditulis sekali, untuk digunakan di mana saja.
Sepenuhnya kerangka-agnostik dan basis data-agnostik.
pdo
)mysqlnd
) atau driver PostgreSQL ( pgsql
) atau driver SQLite ( sqlite
)openssl
)Sertakan perpustakaan melalui Komposer [?]:
$ composer require delight-im/auth
Sertakan pemuat otomatis Komposer:
require __DIR__ . ' /vendor/autoload.php ' ;
Siapkan database dan buat tabel yang diperlukan:
Bermigrasi dari versi sebelumnya proyek ini? Lihat panduan peningkatan kami untuk mendapatkan bantuan.
// $ 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 );
Jika Anda sudah memiliki koneksi PDO
yang terbuka, gunakan saja kembali. Pengguna basis data (misalnya my-username
) memerlukan setidaknya hak istimewa SELECT
, INSERT
, UPDATE
dan DELETE
untuk tabel yang digunakan oleh perpustakaan ini (atau basis data induknya).
Jika server web Anda berada di belakang server proxy dan $_SERVER['REMOTE_ADDR']
hanya berisi alamat IP proxy, Anda harus meneruskan alamat IP asli pengguna ke konstruktor di argumen kedua, yang diberi nama $ipAddress
. Defaultnya adalah alamat IP jarak jauh yang biasa diterima oleh PHP.
Jika tabel database Anda untuk perpustakaan ini memerlukan awalan umum, misalnya my_users
alih-alih users
(dan juga untuk tabel lainnya), teruskan awalan (misalnya my_
) sebagai parameter ketiga ke konstruktor, yang diberi nama $dbTablePrefix
. Ini opsional dan awalannya kosong secara default.
Selama pengembangan, Anda mungkin ingin menonaktifkan pembatasan atau pembatasan permintaan yang dilakukan oleh perpustakaan ini. Untuk melakukannya, teruskan false
ke konstruktor sebagai argumen keempat, yang diberi nama $throttling
. Fitur ini diaktifkan secara default.
Selama masa sesi, beberapa data pengguna dapat diubah dari jarak jauh, baik oleh klien di sesi lain atau oleh administrator. Artinya, informasi ini harus disinkronkan ulang secara rutin dengan sumber resminya di database, yang dilakukan perpustakaan ini secara otomatis. Secara default, ini terjadi setiap lima menit. Jika Anda ingin mengubah interval ini, teruskan interval khusus dalam hitungan detik ke konstruktor sebagai argumen kelima, yang diberi nama $sessionResyncInterval
.
Jika semua tabel database Anda memerlukan nama database umum, nama skema, atau qualifier lain yang harus ditentukan secara eksplisit, Anda dapat meneruskan qualifier tersebut ke konstruktor sebagai parameter keenam, yang diberi nama $dbSchema
.
Jika Anda juga ingin menggunakan instance PdoDatabase
(misalnya $db
) secara mandiri, lihat dokumentasi pustaka database.
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 ' );
}
Catatan: Fungsi panggilan balik anonim adalah penutupan. Jadi, selain parameternya sendiri, hanya superglobal seperti $_GET
, $_POST
, $_COOKIE
dan $_SERVER
yang tersedia di dalamnya. Untuk variabel lain dari lingkup induk, Anda perlu secara eksplisit membuat salinan tersedia di dalamnya dengan menambahkan klausa use
setelah daftar parameter.
Nama pengguna di parameter ketiga bersifat opsional. Anda dapat meneruskan null
di sana jika Anda tidak ingin mengelola nama pengguna.
Sebaliknya, jika Anda ingin menerapkan nama pengguna yang unik, cukup panggil registerWithUniqueUsername
alih-alih register
, dan bersiaplah untuk menangkap DuplicateUsernameException
.
Catatan: Saat menerima dan mengelola nama pengguna, Anda mungkin ingin mengecualikan karakter kontrol non-cetak dan karakter khusus tertentu yang dapat dicetak, seperti pada kelas karakter [x00-x1fx7f/:\]
. Untuk melakukannya, Anda dapat menggabungkan panggilan ke Auth#register
atau Auth#registerWithUniqueUsername
di dalam cabang bersyarat, misalnya dengan hanya menerima nama pengguna ketika kondisi berikut terpenuhi:
if ( preg_match ( ' /[x00-x1fx7f/: \\ ]/ ' , $ username ) === 0 ) {
// ...
}
Untuk verifikasi email, Anda harus membuat URL dengan pemilih dan token dan mengirimkannya ke pengguna, misalnya:
$ url = ' https://www.example.com/verify_email?selector= ' . urlencode ( $ selector ) . ' &token= ' . urlencode ( $ token );
Jika Anda tidak ingin melakukan verifikasi email, hilangkan saja parameter terakhir ke Auth#register
, yaitu fungsi anonim atau penutupan. Pengguna baru akan segera aktif.
Perlu menyimpan informasi pengguna tambahan? Baca terus di sini.
Catatan: Saat mengirim email ke pengguna, harap perhatikan bahwa nama pengguna (opsional), pada saat ini, belum dikonfirmasi dapat diterima oleh pemilik alamat email (baru). Alamat tersebut dapat berisi bahasa yang menyinggung atau menyesatkan yang dipilih oleh seseorang yang sebenarnya bukan pemilik alamat tersebut.
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 ' );
}
Sebaliknya, jika Anda ingin masuk dengan nama pengguna, selain login melalui alamat email atau sebagai pengganti, hal itu juga bisa dilakukan. Cukup panggil metode loginWithUsername
alih-alih metode login
. Lalu, daripada menangkap InvalidEmailException
, pastikan untuk menangkap UnknownUsernameException
dan AmbiguousUsernameException
. Anda mungkin juga ingin membaca catatan tentang keunikan nama pengguna di bagian yang menjelaskan cara mendaftarkan pengguna baru.
Ekstrak pemilih dan token dari URL yang diklik pengguna di email verifikasi.
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 ' );
}
Jika Anda ingin pengguna masuk secara otomatis setelah konfirmasi berhasil, panggil saja confirmEmailAndSignIn
alih-alih confirmEmail
. Metode alternatif tersebut juga mendukung login persisten melalui parameter ketiga opsionalnya.
Jika berhasil, kedua metode confirmEmail
dan confirmEmailAndSignIn
keduanya mengembalikan array dengan alamat email baru pengguna, yang baru saja diverifikasi, pada indeks satu. Jika konfirmasi ditujukan untuk perubahan alamat dan bukan verifikasi alamat sederhana, alamat email lama pengguna akan disertakan dalam array pada indeks nol.
Parameter ketiga pada metode Auth#login
dan Auth#confirmEmailAndSignIn
mengontrol apakah login tetap ada dengan cookie yang berumur panjang. Dengan login persisten seperti itu, pengguna mungkin tetap diautentikasi untuk waktu yang lama, meskipun sesi browser telah ditutup dan cookie sesi telah kedaluwarsa. Biasanya, Anda ingin agar pengguna tetap masuk selama berminggu-minggu atau berbulan-bulan dengan fitur ini, yang dikenal sebagai “ingat saya” atau “biarkan saya tetap masuk”. Banyak pengguna akan merasa hal ini lebih nyaman, namun mungkin menjadi kurang aman jika mereka meninggalkan perangkatnya tanpa pengawasan.
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 );
// . . .
Tanpa login persisten, yang merupakan perilaku default , pengguna hanya akan tetap login sampai mereka menutup browsernya, atau selama dikonfigurasi melalui session.cookie_lifetime
dan session.gc_maxlifetime
di PHP.
Hilangkan parameter ketiga atau setel ke null
untuk menonaktifkan fitur tersebut. Jika tidak, Anda mungkin bertanya kepada pengguna apakah mereka ingin mengaktifkan “ingat saya”. Ini biasanya dilakukan dengan kotak centang di antarmuka pengguna Anda. Gunakan masukan dari kotak centang tersebut untuk memutuskan antara null
dan durasi yang telah ditentukan sebelumnya dalam hitungan detik di sini, misalnya 60 * 60 * 24 * 365.25
untuk satu tahun.
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 ' );
}
Catatan: Fungsi panggilan balik anonim adalah penutupan. Jadi, selain parameternya sendiri, hanya superglobal seperti $_GET
, $_POST
, $_COOKIE
dan $_SERVER
yang tersedia di dalamnya. Untuk variabel lain dari lingkup induk, Anda perlu secara eksplisit membuat salinan tersedia di dalamnya dengan menambahkan klausa use
setelah daftar parameter.
Anda harus membuat URL dengan pemilih dan token dan mengirimkannya ke pengguna, misalnya:
$ url = ' https://www.example.com/reset_password?selector= ' . urlencode ( $ selector ) . ' &token= ' . urlencode ( $ token );
Jika masa berlaku default permintaan pengaturan ulang kata sandi tidak berfungsi untuk Anda, Anda dapat menggunakan parameter ketiga Auth#forgotPassword
untuk menentukan interval khusus dalam hitungan detik setelah permintaan tersebut akan kedaluwarsa.
Pada langkah selanjutnya, pengguna akan mengklik link yang mereka terima. Ekstrak pemilih dan token dari URL.
Jika pasangan pemilih/token valid, biarkan pengguna memilih kata sandi baru:
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 ' );
}
Alternatifnya, jika Anda tidak memerlukan pesan kesalahan apa pun tetapi hanya ingin memeriksa validitasnya, Anda dapat menggunakan versi yang sedikit lebih sederhana:
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 ' ;
}
Sekarang ketika Anda memiliki kata sandi baru untuk pengguna tersebut (dan masih memiliki dua informasi lainnya), Anda dapat mengatur ulang kata sandi:
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 ' );
}
Apakah Anda ingin masing-masing pengguna masuk secara otomatis ketika pengaturan ulang kata sandinya berhasil? Cukup gunakan Auth#resetPasswordAndSignIn
alih-alih Auth#resetPassword
untuk segera memasukkan pengguna.
Jika Anda memerlukan ID atau alamat email pengguna, misalnya untuk mengirimi mereka pemberitahuan bahwa kata sandi mereka telah berhasil direset, cukup gunakan nilai kembalian Auth#resetPassword
, yang merupakan array yang berisi dua entri bernama id
dan email
.
Jika pengguna sedang login, mereka dapat mengubah kata sandinya.
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 ' );
}
Menanyakan kata sandi mereka saat ini (dan segera yang lama ) kepada pengguna dan mewajibkannya untuk verifikasi adalah cara yang disarankan untuk menangani perubahan kata sandi. Ini ditunjukkan di atas.
Namun, jika Anda yakin tidak memerlukan konfirmasi tersebut, Anda dapat memanggil changePasswordWithoutOldPassword
alih-alih changePassword
dan menghapus parameter pertama dari pemanggilan metode tersebut (yang seharusnya berisi kata sandi lama).
Bagaimanapun, setelah kata sandi pengguna diubah, Anda harus mengirim email ke alamat email utama akun mereka sebagai pemberitahuan out-of-band yang memberi tahu pemilik akun tentang perubahan penting ini.
Jika pengguna saat ini masuk, mereka dapat mengubah alamat emailnya.
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 ' );
}
Catatan: Fungsi panggilan balik anonim adalah penutupan. Jadi, selain parameternya sendiri, hanya superglobal seperti $_GET
, $_POST
, $_COOKIE
dan $_SERVER
yang tersedia di dalamnya. Untuk variabel lain dari lingkup induk, Anda perlu secara eksplisit membuat salinan tersedia di dalamnya dengan menambahkan klausa use
setelah daftar parameter.
Untuk verifikasi email, Anda harus membuat URL dengan pemilih dan token dan mengirimkannya ke pengguna, misalnya:
$ url = ' https://www.example.com/verify_email?selector= ' . urlencode ( $ selector ) . ' &token= ' . urlencode ( $ token );
Catatan: Saat mengirim email ke pengguna, harap dicatat bahwa nama pengguna (opsional), pada saat ini, belum dikonfirmasi dapat diterima oleh pemilik alamat email (baru). Alamat tersebut dapat berisi bahasa yang menyinggung atau menyesatkan yang dipilih oleh seseorang yang sebenarnya bukan pemilik alamat tersebut.
Setelah permintaan untuk mengubah alamat email dibuat, atau lebih baik lagi, setelah perubahan dikonfirmasi oleh pengguna, Anda harus mengirim email ke alamat email akun mereka sebelumnya sebagai pemberitahuan out-of-band yang memberi tahu pemilik akun tentang perubahan kritis ini.
Catatan: Perubahan pada alamat email pengguna akan segera berlaku di sesi lokal, seperti yang diharapkan. Namun, di sesi lain (misalnya di perangkat lain), perubahan mungkin memerlukan waktu hingga lima menit agar dapat diterapkan. Ini meningkatkan kinerja dan biasanya tidak menimbulkan masalah. Namun, jika Anda ingin mengubah perilaku ini, cukup kurangi (atau mungkin tambah) nilai yang Anda teruskan ke konstruktor Auth
sebagai argumen bernama $sessionResyncInterval
.
Jika permintaan konfirmasi sebelumnya tidak dapat dikirimkan kepada pengguna, atau jika pengguna melewatkan permintaan tersebut, atau jika mereka tidak ingin menunggu lebih lama lagi, Anda dapat mengirim ulang permintaan sebelumnya seperti ini:
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 ' );
}
Jika Anda ingin menentukan pengguna berdasarkan ID-nya, bukan berdasarkan alamat emailnya, hal ini juga dapat dilakukan:
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 ' );
}
Catatan: Fungsi panggilan balik anonim adalah penutupan. Jadi, selain parameternya sendiri, hanya superglobal seperti $_GET
, $_POST
, $_COOKIE
dan $_SERVER
yang tersedia di dalamnya. Untuk variabel lain dari lingkup induk, Anda perlu secara eksplisit membuat salinan tersedia di dalamnya dengan menambahkan klausa use
setelah daftar parameter.
Biasanya, Anda harus membuat URL dengan pemilih dan token dan mengirimkannya ke pengguna, misalnya sebagai berikut:
$ url = ' https://www.example.com/verify_email?selector= ' . urlencode ( $ selector ) . ' &token= ' . urlencode ( $ token );
Catatan: Saat mengirim email ke pengguna, harap perhatikan bahwa nama pengguna (opsional), pada saat ini, belum dikonfirmasi dapat diterima oleh pemilik alamat email (baru). Alamat tersebut dapat berisi bahasa yang menyinggung atau menyesatkan yang dipilih oleh seseorang yang sebenarnya bukan pemilik alamat tersebut.
$ 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 ' );
}
Selain itu, jika Anda juga menyimpan informasi khusus dalam sesi tersebut, dan jika Anda ingin informasi tersebut dihapus, Anda dapat menghancurkan seluruh sesi dengan memanggil metode kedua:
$ auth -> destroySession ();
Catatan: Logout global akan segera berlaku di sesi lokal, seperti yang diharapkan. Namun, di sesi lain (misalnya di perangkat lain), perubahan mungkin memerlukan waktu hingga lima menit agar dapat diterapkan. Ini meningkatkan kinerja dan biasanya tidak menimbulkan masalah. Namun, jika Anda ingin mengubah perilaku ini, cukup kurangi (atau mungkin tambah) nilai yang Anda teruskan ke konstruktor Auth
sebagai argumen bernama $sessionResyncInterval
.
if ( $ auth -> isLoggedIn ()) {
echo ' User is signed in ' ;
}
else {
echo ' User is not signed in yet ' ;
}
Singkatan/alias untuk metode ini adalah $auth->check()
.
$ id = $ auth -> getUserId ();
Jika pengguna saat ini tidak masuk, ini akan mengembalikan null
.
Singkatan/alias untuk metode ini adalah $auth->id()
.
$ email = $ auth -> getEmail ();
Jika pengguna saat ini tidak masuk, ini akan mengembalikan null
.
$ username = $ auth -> getUsername ();
Ingatlah bahwa nama pengguna bersifat opsional dan hanya ada nama pengguna jika Anda memberikannya saat pendaftaran.
Jika pengguna saat ini tidak masuk, ini akan mengembalikan 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 ' ;
}
Jika pengguna saat ini tidak masuk, ini akan mengembalikan null
.
$ ip = $ auth -> getIpAddress ();
Untuk menjaga kesesuaian perpustakaan ini untuk semua tujuan serta dapat digunakan kembali secara penuh, perpustakaan ini tidak dilengkapi dengan kolom tambahan untuk informasi pengguna. Namun Anda tidak dapat melakukannya tanpa informasi pengguna tambahan, tentu saja:
Berikut cara menggunakan perpustakaan ini dengan tabel Anda sendiri untuk informasi pengguna khusus dengan cara yang dapat dipelihara dan digunakan kembali:
Tambahkan sejumlah tabel database khusus tempat Anda menyimpan informasi pengguna khusus, misalnya tabel bernama profiles
.
Setiap kali Anda memanggil metode register
(yang mengembalikan ID pengguna baru), tambahkan logika Anda sendiri setelahnya yang mengisi tabel database kustom Anda.
Jika Anda jarang memerlukan informasi pengguna khusus, Anda dapat mengambilnya sesuai kebutuhan. Namun, jika Anda membutuhkannya lebih sering, Anda mungkin ingin memilikinya di data sesi Anda. Metode berikut adalah bagaimana Anda dapat memuat dan mengakses data Anda dengan cara yang andal:
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 ' ];
}
Kapanpun Anda ingin mengkonfirmasi identitas pengguna lagi, misalnya sebelum pengguna diizinkan melakukan tindakan “berbahaya”, Anda harus memverifikasi ulang kata sandinya untuk mengonfirmasi bahwa mereka memang benar seperti yang mereka klaim.
Misalnya, ketika pengguna telah diingat oleh cookie yang berumur panjang sehingga Auth#isRemembered
mengembalikan true
, ini berarti pengguna mungkin sudah lama tidak memasukkan kata sandinya lagi. Anda mungkin ingin mengonfirmasi ulang kata sandinya dalam hal ini.
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 ' );
}
Setiap pengguna dapat memiliki sejumlah peran, yang dapat Anda gunakan untuk menerapkan otorisasi dan menyempurnakan kontrol akses Anda.
Pengguna mungkin tidak memiliki peran sama sekali (yang mereka lakukan secara default), hanya satu peran, atau kombinasi peran apa pun.
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 ' ;
}
Meskipun metode hasRole
hanya mengambil satu peran sebagai argumennya, kedua metode hasAnyRole
dan hasAllRoles
dapat mengambil sejumlah peran apa pun yang ingin Anda periksa.
Alternatifnya, Anda bisa mendapatkan daftar semua peran yang telah ditetapkan kepada pengguna:
$ 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 ;
Anda dapat menggunakan salah satu peran ini dan mengabaikan peran yang tidak Anda perlukan. Daftar di atas juga dapat diambil secara terprogram, dalam salah satu dari tiga format:
Delight Auth Role:: getMap ();
// or
Delight Auth Role:: getNames ();
// or
Delight Auth Role:: getValues ();
Izin setiap pengguna dikodekan sedemikian rupa sehingga persyaratan peran ditentukan di seluruh basis kode Anda. Jika persyaratan tersebut dievaluasi dengan serangkaian peran pengguna tertentu, hasilnya adalah izin yang diperiksa secara implisit.
Untuk proyek yang lebih besar, sering kali disarankan untuk mempertahankan definisi izin di satu tempat. Anda kemudian tidak memeriksa peran dalam logika bisnis Anda, tetapi Anda memeriksa izin individual . Anda dapat menerapkan konsep tersebut sebagai berikut:
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 ' ;
}
Seperti yang Anda lihat, izin apakah pengguna tertentu dapat mengedit artikel disimpan di lokasi pusat. Implementasi ini memiliki dua keuntungan utama:
Jika Anda ingin mengetahui pengguna mana yang dapat mengedit artikel, Anda tidak perlu memeriksa logika bisnis Anda di berbagai tempat, tetapi Anda hanya perlu melihat di mana izin spesifik ditentukan. Dan jika Anda ingin mengubah siapa yang dapat mengedit artikel, Anda hanya perlu melakukan ini di satu tempat saja, tidak di seluruh basis kode Anda.
Namun hal ini juga menimbulkan sedikit tambahan biaya saat menerapkan pembatasan akses untuk pertama kalinya, yang mungkin bermanfaat atau tidak untuk proyek Anda.
Jika nama peran yang disertakan tidak cocok untuk Anda, Anda dapat membuat alias sejumlah peran menggunakan pengidentifikasi Anda sendiri, misalnya seperti ini:
namespace My Namespace ;
final class MyRole {
const CUSTOMER_SERVICE_AGENT = Delight Auth Role:: REVIEWER ;
const FINANCIAL_DIRECTOR = Delight Auth Role:: COORDINATOR ;
private function __construct () {}
}
Contoh di atas akan memungkinkan Anda untuk menggunakan
My Namespace MyRole:: CUSTOMER_SERVICE_AGENT ;
// and
My Namespace MyRole:: FINANCIAL_DIRECTOR ;
alih-alih
Delight Auth Role:: REVIEWER ;
// and
Delight Auth Role:: COORDINATOR ;
Ingatlah untuk tidak memasukkan satu peran ke beberapa peran dengan nama khusus.
Meskipun pengaturan ulang kata sandi melalui email adalah fitur praktis yang kadang-kadang berguna bagi sebagian besar pengguna, ketersediaan fitur ini menyiratkan bahwa akun di layanan Anda hanya seaman akun email pengguna yang terkait.
Anda dapat memberikan kemungkinan kepada pengguna yang sadar akan keamanan (dan berpengalaman) untuk menonaktifkan pengaturan ulang kata sandi untuk akun mereka (dan mengaktifkannya lagi nanti) untuk meningkatkan keamanan:
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 ' );
}
Untuk memeriksa nilai saat ini dari pengaturan ini, gunakan nilai kembalian dari
$ auth -> isPasswordResetEnabled ();
untuk opsi default yang benar di antarmuka pengguna Anda. Anda tidak perlu memeriksa nilai ini untuk mengetahui batasan fitur, yang diterapkan secara otomatis.
Semua metode yang disediakan oleh perpustakaan ini secara otomatis terlindungi dari permintaan berlebihan dari klien. Jika diperlukan, Anda dapat (sementara) menonaktifkan perlindungan ini menggunakan parameter $throttling
yang diteruskan ke konstruktor.
Jika Anda juga ingin membatasi atau membatasi fitur atau metode eksternal , misalnya yang ada dalam kode Anda sendiri, Anda dapat menggunakan metode pembantu bawaan untuk membatasi dan membatasi laju:
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 ;
}
Jika perlindungan sumber daya atau fitur juga harus bergantung pada atribut lain, misalnya untuk melacak sesuatu secara terpisah per alamat IP, cukup tambahkan lebih banyak data ke deskripsi sumber daya, seperti:
[ ' my-resource-name ' , $ _SERVER [ ' REMOTE_ADDR ' ] ]
// instead of
// [ ' my-resource-name' ]
Mengizinkan ledakan aktivitas singkat selama permintaan puncak dapat dilakukan dengan menentukan faktor ledakan sebagai argumen keempat. Nilai 5
, misalnya, akan memungkinkan terjadinya ledakan sementara aktivitas lima kali lipat, dibandingkan dengan tingkat yang diterima secara umum.
Dalam beberapa kasus, Anda mungkin hanya ingin melakukan simulasi pembatasan atau pembatasan laju. Ini memungkinkan Anda memeriksa apakah suatu tindakan diizinkan tanpa benar-benar mengubah pelacak aktivitas. Untuk melakukannya, cukup berikan nilai true
sebagai argumen kelima.
Catatan: Saat Anda menonaktifkan pembatasan pada instance (menggunakan parameter $throttling
yang diteruskan ke konstruktor), tindakan ini akan menonaktifkan perlindungan internal otomatis dan efek panggilan apa pun ke Auth#throttle
dalam kode aplikasi Anda sendiri – kecuali Anda juga menyetel parameter opsional $force
menjadi true
dalam panggilan Auth#throttle
tertentu.
Antarmuka administratif tersedia melalui $auth->admin()
. Anda dapat memanggil berbagai metode pada antarmuka ini, seperti yang didokumentasikan di bawah ini.
Jangan lupa untuk menerapkan kontrol akses yang aman sebelum memaparkan akses ke antarmuka ini. Misalnya, Anda dapat memberikan akses ke antarmuka ini kepada pengguna yang masuk dengan peran administrator saja, atau menggunakan antarmuka dalam skrip pribadi saja.
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 ' );
}
Nama pengguna di parameter ketiga bersifat opsional. Anda dapat meneruskan null
di sana jika Anda tidak ingin mengelola nama pengguna.
Sebaliknya, jika Anda ingin menerapkan nama pengguna yang unik, cukup panggil createUserWithUniqueUsername
alih-alih createUser
, dan bersiaplah untuk menangkap DuplicateUsernameException
.
Menghapus pengguna berdasarkan ID mereka:
try {
$ auth -> admin ()-> deleteUserById ( $ _POST [ ' id ' ]);
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown ID ' );
}
Menghapus pengguna berdasarkan alamat email mereka:
try {
$ auth -> admin ()-> deleteUserByEmail ( $ _POST [ ' email ' ]);
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Unknown email address ' );
}
Menghapus pengguna berdasarkan nama pengguna mereka:
try {
$ auth -> admin ()-> deleteUserByUsername ( $ _POST [ ' username ' ]);
}
catch ( Delight Auth UnknownUsernameException $ e ) {
die ( ' Unknown username ' );
}
catch ( Delight Auth AmbiguousUsernameException $ e ) {
die ( ' Ambiguous username ' );
}
Saat mengambil daftar semua pengguna, persyaratannya sangat bervariasi antara proyek dan kasus penggunaan, dan penyesuaian adalah hal yang umum. Misalnya, Anda mungkin ingin mengambil kolom berbeda, menggabungkan tabel terkait, memfilter menurut kriteria tertentu, mengubah cara pengurutan hasil (dalam berbagai arah), dan membatasi jumlah hasil (sambil memberikan offset).
Itu sebabnya lebih mudah menggunakan satu kueri SQL khusus. Mulailah dengan yang berikut ini:
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 ' );
}
Catatan: Perubahan pada kumpulan peran pengguna mungkin memerlukan waktu hingga lima menit agar dapat diterapkan. Ini meningkatkan kinerja dan biasanya tidak menimbulkan masalah. Namun, jika Anda ingin mengubah perilaku ini, cukup kurangi (atau mungkin tambah) nilai yang Anda teruskan ke konstruktor Auth
sebagai argumen bernama $sessionResyncInterval
.
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 ' );
}
Catatan: Perubahan pada kumpulan peran pengguna mungkin memerlukan waktu hingga lima menit agar dapat diterapkan. Ini meningkatkan kinerja dan biasanya tidak menimbulkan masalah. Namun, jika Anda ingin mengubah perilaku ini, cukup kurangi (atau mungkin tambah) nilai yang Anda teruskan ke konstruktor Auth
sebagai argumen bernama $sessionResyncInterval
.
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 ' );
}
Alternatifnya, Anda bisa mendapatkan daftar semua peran yang telah ditetapkan kepada pengguna:
$ 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 ' );
}
Pustaka ini menggunakan dua cookie untuk menyimpan status pada klien: Yang pertama, yang namanya dapat Anda gunakan untuk mengambil
session_name ();
adalah cookie sesi umum (wajib). Cookie kedua (opsional) hanya digunakan untuk login persisten dan namanya dapat diambil sebagai berikut:
Delight Auth Auth:: createRememberCookieName ();
Anda dapat mengganti nama cookie sesi yang digunakan oleh perpustakaan ini melalui salah satu cara berikut, sesuai urutan rekomendasi:
Dalam konfigurasi PHP ( php.ini
), temukan baris dengan direktif session.name
dan ubah nilainya menjadi seperti session_v1
, seperti pada:
session.name = session_v1
Sedini mungkin dalam aplikasi Anda, dan sebelum Anda membuat instance Auth
, panggil ini_set
untuk mengubah session.name
menjadi sesuatu seperti session_v1
, seperti pada:
ini_set ( ' session.name ' , ' session_v1 ' );
Agar ini berfungsi, session.auto_start
harus disetel ke 0
dalam konfigurasi PHP ( php.ini
).
Sedini mungkin dalam aplikasi Anda, dan sebelum Anda membuat instance Auth
, panggil session_name
dengan argumen seperti session_v1
, seperti pada:
session_name ( ' session_v1 ' );
Agar ini berfungsi, session.auto_start
harus disetel ke 0
dalam konfigurasi PHP ( php.ini
).
Nama cookie untuk login persisten juga akan berubah – secara otomatis – mengikuti perubahan nama cookie sesi Anda.
Atribut domain
cookie mengontrol domain mana (dan subdomain mana) yang akan valid untuk cookie tersebut, dan dengan demikian di mana sesi pengguna dan status autentikasi akan tersedia.
Default yang disarankan adalah string kosong, yang berarti cookie hanya akan valid untuk host saat ini , tidak termasuk subdomain apa pun yang mungkin ada. Anda sebaiknya hanya menggunakan nilai yang berbeda jika Anda perlu berbagi cookie antar subdomain yang berbeda. Seringkali, Anda ingin berbagi cookie antara domain kosong dan subdomain www
, namun Anda mungkin juga ingin membaginya di antara kumpulan subdomain lainnya.
Apa pun kumpulan subdomain yang Anda pilih, Anda harus menyetel atribut cookie ke nama domain paling spesifik yang masih menyertakan semua subdomain yang diperlukan. Misalnya, untuk berbagi cookie antara example.com
dan www.example.com
, Anda harus menyetel atribut ke example.com
. Namun jika Anda ingin berbagi cookie antara sub1.app.example.com
dan sub2.app.example.com
, Anda harus menyetel atributnya ke app.example.com
. Nama domain apa pun yang ditentukan secara eksplisit akan selalu menyertakan semua subdomain yang mungkin ada.
Anda dapat mengubah atribut melalui salah satu cara berikut, sesuai urutan rekomendasi:
Pada konfigurasi PHP ( php.ini
), cari baris dengan direktif session.cookie_domain
dan ubah nilainya sesuai keinginan, misal:
session.cookie_domain = example.com
Sedini mungkin dalam aplikasi Anda, dan sebelum Anda membuat instance Auth
, panggil ini_set
untuk mengubah nilai direktif session.cookie_domain
sesuai keinginan, misalnya:
ini_set ( ' session.cookie_domain ' , ' example.com ' );
Agar ini berfungsi, session.auto_start
harus disetel ke 0
dalam konfigurasi PHP ( php.ini
).
Atribut path
cookie mengontrol direktori (dan subdirektori) mana yang akan valid untuk cookie tersebut, dan dengan demikian di mana sesi pengguna dan status autentikasi akan tersedia.
Dalam kebanyakan kasus, Anda ingin membuat cookie tersedia untuk semua jalur, yaitu direktori dan file apa pun, dimulai dari direktori root. Itulah yang dilakukan oleh nilai /
untuk atribut, yang juga merupakan nilai default yang direkomendasikan. Anda hanya boleh mengubah atribut ini ke nilai yang berbeda, misalnya /path/to/subfolder
, jika Anda ingin membatasi di direktori mana cookie Anda akan tersedia, misalnya untuk meng-host beberapa aplikasi secara berdampingan, di direktori berbeda, di bawah nama domain yang sama.
Anda dapat mengubah atribut melalui salah satu cara berikut, sesuai urutan rekomendasi:
Pada konfigurasi PHP ( php.ini
), cari baris dengan direktif session.cookie_path
dan ubah nilainya sesuai keinginan, misal:
session.cookie_path = /
Sedini mungkin dalam aplikasi Anda, dan sebelum Anda membuat instance Auth
, panggil ini_set
untuk mengubah nilai direktif session.cookie_path
sesuai keinginan, misalnya:
ini_set ( ' session.cookie_path ' , ' / ' );
Agar ini berfungsi, session.auto_start
harus disetel ke 0
dalam konfigurasi PHP ( php.ini
).
Dengan menggunakan atribut httponly
, Anda dapat mengontrol apakah skrip sisi klien, misalnya JavaScript, dapat mengakses cookie Anda atau tidak. Demi alasan keamanan, yang terbaik adalah menolak akses skrip ke cookie Anda, sehingga mengurangi kerusakan yang dapat ditimbulkan oleh serangan XSS yang berhasil terhadap aplikasi Anda, misalnya.
Oleh karena itu, Anda harus selalu menyetel httponly
ke 1
, kecuali dalam kasus yang jarang terjadi di mana Anda benar-benar memerlukan akses ke cookie dari JavaScript dan tidak dapat menemukan solusi yang lebih baik. Dalam kasus tersebut, setel atribut ke 0
, namun waspadai konsekuensinya.
Anda dapat mengubah atribut melalui salah satu cara berikut, sesuai urutan rekomendasi:
Pada konfigurasi PHP ( php.ini
), cari baris dengan direktif session.cookie_httponly
dan ubah nilainya sesuai keinginan, misal:
session.cookie_httponly = 1
Sedini mungkin dalam aplikasi Anda, dan sebelum Anda membuat instance Auth
, panggil ini_set
untuk mengubah nilai direktif session.cookie_httponly
sesuai keinginan, misalnya:
ini_set ( ' session.cookie_httponly ' , 1 );
Agar ini berfungsi, session.auto_start
harus disetel ke 0
dalam konfigurasi PHP ( php.ini
).
Dengan menggunakan atribut secure
, Anda dapat mengontrol apakah cookie harus dikirim melalui koneksi apa pun , termasuk HTTP biasa, atau apakah koneksi aman, misalnya HTTPS (dengan SSL/TLS), diperlukan. Mode pertama (kurang aman) dapat dipilih dengan mengatur atribut ke 0
, dan mode terakhir (lebih aman) dapat dipilih dengan mengatur atribut ke 1
.
Tentu saja, hal ini bergantung pada apakah Anda dapat menyajikan semua halaman secara eksklusif melalui HTTPS. Jika bisa, Anda harus menyetel atribut ke 1
dan mungkin menggabungkannya dengan pengalihan HTTP ke protokol aman dan HTTP Strict Transport Security (HSTS). Jika tidak, Anda mungkin harus membiarkan atribut disetel ke 0
.
Anda dapat mengubah atribut melalui salah satu cara berikut, sesuai urutan rekomendasi:
Pada konfigurasi PHP ( php.ini
), cari baris dengan direktif session.cookie_secure
dan ubah nilainya sesuai keinginan, misal:
session.cookie_secure = 1
Sedini mungkin dalam aplikasi Anda, dan sebelum Anda membuat instance Auth
, panggil ini_set
untuk mengubah nilai direktif session.cookie_secure
sesuai keinginan, misalnya:
ini_set ( ' session.cookie_secure ' , 1 );
Agar ini berfungsi, session.auto_start
harus disetel ke 0
dalam konfigurasi PHP ( php.ini
).
$ length = 24 ;
$ randomStr = Delight Auth Auth:: createRandomString ( $ length );
$ uuid = Delight Auth Auth:: createUuid ();
Untuk informasi rinci tentang cara membaca dan menulis data sesi dengan mudah, silakan merujuk ke dokumentasi perpustakaan sesi, yang disertakan secara default.
Kata sandi atau token autentikasi apa pun secara otomatis di-hash menggunakan fungsi “bcrypt”, yang didasarkan pada sandi “Blowfish” dan (masih) dianggap sebagai salah satu fungsi hash kata sandi terkuat saat ini. “bcrypt” digunakan dengan 1.024 iterasi, yaitu faktor “biaya” sebesar 10. “garam” acak juga diterapkan secara otomatis.
Anda dapat memverifikasi konfigurasi ini dengan melihat hash di tabel database Anda users
. Jika hal di atas benar dengan pengaturan Anda, semua hash kata sandi di tabel users
Anda harus dimulai dengan awalan $2$10$
, $2a$10$
atau $2y$10$
.
Ketika algoritma baru (seperti Argon2) mungkin diperkenalkan di masa depan, perpustakaan ini akan secara otomatis menangani “peningkatan” hash kata sandi Anda yang ada setiap kali pengguna masuk atau mengubah kata sandi mereka.
Menerapkan panjang minimum kata sandi biasanya merupakan ide bagus. Selain itu, Anda mungkin ingin mencari apakah kata sandi potensial ada dalam daftar hitam, yang dapat Anda kelola dalam database atau dalam file, untuk mencegah kata-kata kamus atau kata sandi yang umum digunakan digunakan dalam aplikasi Anda.
Untuk memungkinkan fleksibilitas maksimum dan kemudahan penggunaan, perpustakaan ini telah dirancang sedemikian rupa sehingga tidak berisi pemeriksaan lebih lanjut untuk persyaratan kata sandi itu sendiri, namun memungkinkan Anda untuk membungkus pemeriksaan Anda sendiri di sekitar panggilan yang relevan ke metode perpustakaan. Contoh:
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 );
}
Anda dapat mencoba memuat perpustakaan ini terlebih dahulu, dan membuat instance Auth
terlebih dahulu, sebelum memuat perpustakaan lainnya. Selain itu, mungkin tidak banyak yang bisa kita lakukan di sini.
Jika Anda ingin membiarkan orang lain memasukkan situs Anda ke dalam elemen <frame>
, <iframe>
, <object>
, <embed>
atau <applet>
, Anda harus menonaktifkan pencegahan clickjacking default:
header_remove ( ' X-Frame-Options ' );
Pustaka ini memberikan dua jenis pengecualian untuk menunjukkan masalah:
AuthException
dan subkelasnya dilemparkan setiap kali suatu metode tidak berhasil diselesaikan. Anda harus selalu menangkap pengecualian ini karena pengecualian tersebut membawa respons kesalahan normal yang harus Anda tanggapi.AuthError
dan subkelasnya muncul setiap kali ada masalah internal atau perpustakaan belum diinstal dengan benar. Anda tidak boleh menangkap pengecualian ini. Semua kontribusi dipersilakan! Jika Anda ingin berkontribusi, silakan buat masalah terlebih dahulu sehingga fitur, masalah, atau pertanyaan Anda dapat dibahas.
Proyek ini dilisensikan berdasarkan ketentuan lisensi MIT.