Skip to content

Kõik WordPressist, veebiarendusest — ja mitte ainult

🚀 Automaatne WordPressi sisselogimine PHP-s: koodijupp demojuurdepääsuks

🚀 Automaatne WordPressi sisselogimine PHP-s: koodijupp demojuurdepääsuks

Demo-juurdepääs WordPressi administraatori paneelile on standardne viis pistikprogrammide ja teemade müümiseks. Potentsiaalne ostja külastab saiti, näeb kasutajanime ja parooli, kopeerib need, läheb wp-login.php lehele, kleebib... Liiga palju samme. Iga lisaklik filtreerib osa vaatajaskonnast välja.

Automaatne sisselogimine lingi kaudu lahendab selle probleemi radikaalselt: üks link ja kasutaja on juba administraatori paneelis, vajaliku konto all. Ei mingit kopeerimist-kleepimist ega segadust sisselogimisandmetega.

Allpool on valmis PHP koodijupp, mis lisab selle mehhanismi igale WordPressi saidile. Kakskümmend koodirida, kohandamine võtab 2 minutit. Koodijupp ei sõltu teemast, ei too sisse väliseid sõltuvusi ja aktiveerub nagu tavaline pistikprogramm.

💡 Kiirülevaade:

  • Lisate sisselogimisaadressile URL-i parameetri (näiteks ?autologin=demo) ja wp_signon() autoriseerib kasutaja määratud konto all koos ümbersuunamisega vajalikku jaotisesse
  • Koodijupp on vormistatud eraldi WordPressi pistikprogrammina: aktiveerige ja see töötab kohe, deaktiveerige ja see on keelatud, teema ei ole sellega seotud
  • Põhiversioon teenindab ühte kontot, laiendatud versioon toetab suvalist arvu kontosid erinevate rollide ja sihtpunktidega
  • Kohandamine oma projekti jaoks: muutke koodis kolme väärtust (kasutajanimi, parool, URL-i võti), laadige pistikprogramm saidile ja saate sisselogimise lingi kaudu

Kuidas automaatne sisselogimine töötab: wp_signon mehaanika

Kogu struktuuri tuum on funktsioon wp_signon(). See võtab vastu sisselogimisandmed: kasutajanime, parooli ja mäletamise lipu, seejärel autoriseerib kasutaja täpselt nagu standardne vorm lehel wp-login.php. Erinevus on selles, et väljakutse toimub programmiliselt, ilma inimese osaluseta. Kasutaja lihtsalt järgib linki ja satub sisse.

Konks after_setup_theme käivitub enne päiste saatmist, mis on kriitiline, sest wp_signon() määrab autentimisküpsise ja küpsised tuleb saata enne igasugust väljundit brauserisse. Kui riputate väljakutse konksu init või hilisema konksu külge, ei pruugi sisselogimine töötada. Just seetõttu on koodijupp vormistatud eraldi pistikprogrammina, mitte ei ole lisatud teema functions.php faili: pistikprogramm laaditakse WordPressi elutsükli väga varajastes etappides, tagades, et konks käivitatakse õigel ajal.

WordPressi automaatse sisselogimise plugina täielik kood

Siin on minimaalne töötav pistikprogramm:

1<?php
2/*
3Plugin Name: Auto Login
4Plugin URI: https://techblog.sdstudio.top/
5Version: 1.0.0
6Author: Harri Bell-Thomas
7*/
8
9function autologin() {
10 if ( $_GET['autologin'] !== 'demo' ) {
11 return;
12 }
13
14 $creds = array(
15 'user_login' => 'demo',
16 'user_password' => 'demo',
17 'remember' => true,
18 );
19
20 $user = wp_signon( $creds, false );
21
22 if ( ! is_wp_error( $user ) ) {
23 wp_redirect( admin_url() );
24 exit;
25 }
26}
27add_action( 'after_setup_theme', 'autologin' );

Vaatame selle rida-realt üle. Tingimus $_GET['autologin'] === 'demo' kontrollib, et URL-is on edastatud nõutav parameeter: wp-login.php?autologin=demo. Massiiv $creds sisaldab kasutajanime, parooli ja „mäleta mind" lippu. wp_signon() parameetriga false tähendab: ära kasuta turvalist küpsist (sobib kohalikuks arenduseks ja testimissaitidele ilma HTTPS-ita). Edu korral suunab wp_redirect( admin_url() ) kasutaja administraatori paneeli. Vea korral (vale parool, olematu kasutaja) näitab WordPress standardset sisselogimisvormi, paljastamata, et toimus automaatse sisselogimise katse.

Kohandamine oma projekti jaoks

Koodijupi kohandamiseks piisab kolme väärtuse muutmisest: URL-i parameeter, kasutajanimi ja parool. Järgmises plokis on need mugavuse huvides funktsiooni algusesse tõstetud:

1function autologin() {
2 $param = 'autologin';
3 $user = 'dummy';
4 $pass = 'pa55word';
5
6 if ( $_GET[ $param ] !== $user ) {
7 return;
8 }
9
10 $creds = array(
11 'user_login' => $user,
12 'user_password' => $pass,
13 'remember' => true,
14 );
15
16 $login = wp_signon( $creds, false );
17
18 if ( ! is_wp_error( $login ) ) {
19 wp_redirect( admin_url() );
20 exit;
21 }
22}

Kolm reeglit kohandamisel, mis säästavad teid tundidepikkusest silumisest.

Esiteks: parameetri $user väärtus ei tohi kattuda WordPressi reserveeritud võtmetega. Reserveeritud on neli võtit: loggedout väljalogimiseks, action parooli lähtestamiseks, redirect_to ümbersuunamiseks pärast sisselogimist ja wp_lang keele vahetamiseks. Kui võtate mõne neist sõnadest, siis automaatne sisselogimine kas ei tööta või lõhub tuuma standardse käitumise.

Teiseks: parooli hoitakse pistikprogrammi koodis avatekstina, seega ärge kunagi kasutage seda koodijuppi administraatori või toimetaja kontode jaoks töötaval saidil. Demo-kasutaja tellija rolliga või maksimaalselt toimetaja rolliga on vastuvõetav. Administraator automaatse sisselogimisega lingi kaudu on turvaauk, mille ründaja sekundiga leiab.

Kolmandaks: kui sait töötab HTTPS-i kaudu, asendage wp_signon() teises argumendis false väärtusega true. See lubab turvalise küpsise ja hoiab ära autentimisloa varguse võrguedastuse ajal.

Sisselogimisaadress näeb välja selline: https://your-site.com/wp-login.php?autologin=dummy. Sellele järgnedes satub kasutaja koheselt administraatori paneeli. Ei mingeid vahekuvasid ega sisselogimisandmete kopeerimist-kleepimist.

Aga mis siis, kui demosait näitab toodet erinevatest rollidest? Administraator näeb seadete paneeli, toimetaja näeb avaldamise liidest, tellija näeb isiklikku kontot. Selle stsenaariumi jaoks laiendame koodijuppi, et toetada mitut kontot:

1<?php
2/*
3Plugin Name: Auto Login
4Plugin URI: https://techblog.sdstudio.top/
5Description: Automatic login for demo accounts. Configure accounts in the array below.
6Version: 1.0.0
7Author: Harri Bell-Thomas
8*/
9
10$autologin_param = 'autologin';
11
12$autologin_accounts = array(
13 array(
14 'user' => 'demo',
15 'pass' => 'demo',
16 'location' => 'wp-admin',
17 ),
18 array(
19 'user' => 'editor_demo',
20 'pass' => 'demo',
21 'location' => 'wp-admin/post-new.php',
22 ),
23);
24
25function autologin() {
26 global $autologin_param, $autologin_accounts;
27
28 foreach ( $autologin_accounts as $account ) {
29 if ( $_GET[ $autologin_param ] === $account['user'] ) {
30 $creds = array(
31 'user_login' => $account['user'],
32 'user_password' => $account['pass'],
33 'remember' => true,
34 );
35
36 $user = wp_signon( $creds, false );
37
38 if ( ! is_wp_error( $user ) ) {
39 wp_redirect( admin_url( $account['location'] ) );
40 exit;
41 }
42 }
43 }
44}
45add_action( 'after_setup_theme', 'autologin' );

Mehaanika on sama, kuid massiiv $autologin_accounts salvestab kõigi demokasutajate sisselogimisandmed ja foreach itereerib need läbi, otsides vastet URL-i parameetri väärtuse järgi. Uue konto lisamine taandub massiiviploki kopeerimisele uute user, pass ja location väärtustega.

Parameeter location aktsepteerib mis tahes suhtelist teed /wp-admin/ sees: näiteks options-general.php seadete lehe jaoks, edit.php postituste nimekirja jaoks või post-new.php uue postituse loomiseks. Võite määrata ka täis-URL-i esiotsa suunamiseks, kuid siis asendage koodis admin_url( $account['location'] ) väärtusega $account['location'].

Sisenemispunkt on sama: https://your-site.com/wp-login.php?autologin=editor_demo ja kasutaja satub postituse loomise lehele, mitte administraatori juure. Demosaidi omaniku jaoks tähendab see täielikku kontrolli esmamulje üle: iga kasutajatüüp näeb täpselt seda toote osa, mis on tema huvide jaoks asjakohane.

⁉️🤔 Korduma kippuvad küsimused

Kas paroolide hoidmine pistikprogrammi koodis on turvaline?

Ei, see ei ole turvaline. Koodijupp on loodud demosaitide jaoks, kus kontod on tahtlikult avalikud ja neil ei ole tegelikke õigusi. Tootmissaidil päris kasutajatega on selline lähenemine vastuvõetamatu: avatekstis parool võib lekida iga koodiauditi käigus. Tootmisstsenaariumide puhul kaaluge ühekordse loa mehhanismi või SSO-d REST API kaudu koos nonce-kontrolliga.

Miks mitte wp_login tegevus, vaid otse wp_signon?

Konks wp_login käivitub pärast edukat sisselogimist, see ei teosta autoriseerimist ise. wp_signon() on funktsioon, mis autentib kasutaja: see kontrollib parooli wp_authenticate() kaudu, määrab küpsise ja käivitab wp_login tagajärjena. Kui teil on vaja ainult kasutajat programmiliselt autoriseerida, on wp_signon teie tööriist.

Kas ma võin koodijupi lisada functions.php faili eraldi pistikprogrammi asemel?

Jah, kood töötab ka teema functions.php failis. Kuid pistikprogramm on mugavam: automaatne sisselogimine ei ole teemaga seotud ega lakka töötamast teema vahetamisel. Lisaks saab pistikprogrammi ühe klõpsuga deaktiveerida, ilma et peaks faile serveris redigeerima.

Mida teha, kui pärast sisselogimist ei ole kasutaja is_user_logged_in jaoks autoriseeritud?

See on wp_signon() tuntud eripära, kui seda kutsutakse enne init konksu: küpsis on määratud, kuid globaalne $current_user ei ole veel uuendatud. Lahendus on sundida wp_set_current_user( $user->ID ) kohe pärast edukat wp_signon() väljakutset. Meie koodijupis ei ole see kriitiline, sest kohe järgneb ümbersuunamine, kuid stsenaariumides ilma ümbersuunamiseta on see rida kohustuslik.

Kas koodijupp töötab multisaidil?

Jah, kuid ühe mööndusega. wp_signon() autoriseerib kasutaja võrgu praeguse saidi piires. Kui konto eksisteerib ainult ühel alamsaidil, ei tööta automaatne sisselogimine teistel. Kogu võrguüleseks autentimiseks kasutage kombinatsiooni wp_signon() ja wp_set_auth_cookie() koos küpsise sunnitud paigaldamisega peadomeenile.

Automaatse sisselogimise koodijupp: mis on kokkuvõte

Viisteist rida PHP-d kõrvaldavad peamise hõõrdumise demosaidi lehtris: kasutajanime ja parooli kopeerimise. Üks link ja külastaja on toote sees, rolliga ja jaotises, mille te valisite.

Põhiversioon katab „ühe demokasutaja" stsenaariumi, laiendatud versioon suvalise arvu rolle erinevate ümbersuunamispunktidega. Mõlemad ei sõltu teemast, ei vaja kolmandate osapoolte pistikprogramme ja aktiveeruvad minutiga.

Peamine turvareegel on mitte tõsta õigusi. Demo-kasutaja tellija rolliga või maksimaalselt toimetaja rolliga on vastuvõetav. Administraator automaatse sisselogimisega lingi kaudu on turvaauk, mille ründaja sekundiga leiab.

Kui demojuurdepääs on teie jaoks müügikanal, lakkab automaatne sisselogimine olemast „tore lisand" ja muutub kohustuslikuks konversioonielemendiks. Üks link kasutajanime ja parooli asemel on erinevus „proovin hiljem" ja „proovin kohe" vahel.