Ένα μικρό τρικ για authentication στο WordPress

Το τελευταίο διάστημα προέκυψε στη Nannuka η ανάγκη για ένα site με πληροφορίες για τους υπαλλήλους μας (οδηγίες για τη διαχείριση, εσωτερική ενημέρωση κλπ).

Οι επιλογές που είχαμε ουσιαστικά ήταν τρεις:

  • Να αγοράσουμε κάποια πλατφόρμα (π.χ. confluece) και να τη συνδέσουμε με το back-end μας για να δίνει πρόσβαση μόνο στους διαχειριστές μας – Πολύ ωραία λύση, αλλά με αρκετά μεγάλο κόστος
  • Να δημιουργήσουμε μια νέα υποδομή στο διαχειριστικό μας ώστε να αναρτάμε εκεί ότι θέλουμε – Κάτι που λύνει όλα τα θέματα του authentication κλπ, αλλά απαιτεί χρόνο από την ομάδα του development
  • Να στήσουμε κάποιο open source εργαλείο για αυτή τη δουλειά, και να στήσουμε απλά κάποιο σύστημα για το authentication των διαχειριστών μας

Αφού μια από τις αγαπημένες μας πλατφόρμες είναι το WordPress, τελικά αποφασίσαμε να προχωρήσουμε στην τρίτη λύση.

Το “τρικ” που κάναμε για το authentication είναι τόσο απλό που σκεφτήκαμε να το δημοσιεύσουμε εδώ, για όποιον μπορεί να χρειάζεται κάτι παρόμοιο.

Κατ’ αρχήν βρήκαμε ένα theme που μας αρέσει (έστω twentyseventeen), και φτιάξαμε ένα child theme (έστω Nannuka). Οπότε έχουμε ένα style.css που μοιάζει κάπως έτσι:

/*
Theme Name: Nannuka Docs
Theme URI: https://techblog.nannuka.com
Description: Our child theme
Author: Nannuka
Author URI: https://techblog.nannuka.com
Template: twentyseventeen
Version: 1.000
*/

@import url("../twentyseventeen/style.css");

και έτσι απλά έχουμε το δικό μας (λέμε τώρα) theme.

Επόμενο βήμα είναι να δούμε πως κάνουμε το authentication. Φτιάξαμε ένα αρχείο functions.php με το εξής (περίπου) περιεχόμενο.

<?php
/**
 * Nannuka Docs Functions
 *
 * @since 1.0
 */
session_start();

define (URL, '#Εδώ βάλαμε μια διεύθυνση από το back-end μας');
require_once ('Εδώ βάλαμε την κλάση με τους χρήστες μας από το back-end');


if (!isset($_SESSION['user'])) {
    header('location: ' . URL);
    die();
}
if ($_SESSION['user']->usertype < 90) {
    header('location: ' . URL);
    die();
}

if ( διάφοροι άλλοι έλεγχοι πάνω στο αντικείμενο) {
    header('location: ' . URL);
    die();
}

Με άλλα λόγια, το μόνο που κάναμε ήταν να φορτώσουμε από το κανονικό codebase μας την κλάση που κρατάει τα στοιχεία του authentication. Όταν φορτώνει το theme, τσεκάρουμε αν στη $_SESSION υπάρχει instance αυτής της κλάσης, και μέσω αυτού κάνουμε ότι έλεγχο χρειάζεται για το αν ο χρήστης έχει πρόσβαση στη συγκεκριμένη ενότητα.  Όταν όμως κάτι από αυτά δεν υπάρχει, απλώς κάνουμε redirect τον χρήστη σε ένα url του διαχειριστικού μας, ειδικά διαμορφωμένο για να κάνει ένα μόνο πράγμα. Ελέγχει αν ο χρήστης είναι authenticated. Αν δεν είναι, τον βάζει να κάνει login και μετά τον κάνει redirect ξανά στο wordpress. Αν είναι authenticated, απλώς γράφει το αντικείμενο του authentication στη $_SESSION, και πάλι στέλνει το χρήστη στο wordpress. Αυτό το url είναι επίσης που έχουμε δώσει σε όλους μας τους χρήστες που θέλουμε να δουν τη συγκεκριμένη ενότητα.

Αυτό το τρικ δεν προσφέρει πάρα πολύ δυνατή ασφάλεια (έτσι κι αλλιώς δεν έχουμε τέτοια απαίτηση, αφού δεν ανεβάζουμε ευαίσθητα στοιχεία στο συγκεκριμένο site), αλλά είναι εξαιρετικά απλό στην υλοποίηση και φυσικά μπορεί να χτιστεί παραπάνω ανάλογα με τις ανάγκες.

 

Απάντηση

Αυτός ο ιστότοπος χρησιμοποιεί το Akismet για να μειώσει τα ανεπιθύμητα σχόλια. Μάθετε πώς υφίστανται επεξεργασία τα δεδομένα των σχολίων σας.