niedziela, 24 lipca 2016

Jak automatycznie pobierać kursy walut NBP ?

Automatyczne pobieranie kursów poszczególnych walut z sieci to niekiedy złożone zadanie, z którym jednak każdy zawodowy twórca systemów informatycznych prędzej czy później musi się zmierzyć.
W niniejszym artykule, który przeznaczony jest dla średnio zaawansowanych i zaawansowanych programistów, chciałbym przestawić uproszczoną wersję opracowanej przeze mnie i wielokrotnie zastosowanej w wielu środowiskach produkcyjnych, metodę pobierania z sieci średniego kursu danej waluty z wybranej daty oraz automatycznego wstawiania tej wartości do formularza HTML w aplikacjach web.

Kursy walut z API NBP
Kursy walut dla aplikacji web - API NBP - Jak to działa


Jak dobrze wiadomo, w aplikacjach o charakterze finansowym, bądź biznesowym, dość często pojawia się konieczność wpisywania aktualnego kursu danej waluty do przetwarzanego na serwerze formularza. Po co więc za każdym razem wchodzić na witrynę Narodowego Banku Polskiego NBP, szukać tam tabeli kursów z danego dnia, odczytywać z niej wartości i przepisywać, bądź kopiować i wklejać do formularza, skoro można w sposób w pełni zautomatyzowany pobierać wartości kursów i wstawiać je do fomularza web za jednym wciśnięciem przycisku? Zautomatyzowane rozwiązanie może okazać się bardzo przydatne, szczególnie w przypadku konieczności codziennego, częstego odczytu wartości kursów walut, np. w aplikacjach web związanych z eksportem i fakturowaniem.
Przedstawiona tutaj metoda automatycznego pobierania średniego kursu Euro, obowiązującego dla konkretnej daty, wymaga zastosowania zarówno skryptów jQuery - po stronie przeglądarki - jak i skryptów php po stronie serwera oraz uproszczonego, przykładowego kodu html, koniecznego do osadzenia w nim formularza.
Chciałbym z góry zaznaczyć, że działającym przykładem zastosowania przedstawionego tutaj rozwiązania jest witryna Kursy Walut mojego autorstwa.

Założenia wstępne


Przedstawiony w niniejszym artykule przykład jest zupełnie "nagi" i ma służyć jedynie jako materiał szkoleniowy. Nie zastosowałem w nim żadnych dodatkowych funkcji, oprócz tych, które są niezbędne do zwyczjnego zadziałania mechanizmu. Aby jednak mechanizm mógł mieć zastosowanie w środowisku produkcyjnym, powinien on zostać opatrzony przez programistę w należyte środki bezpieczeńśtwa.

Skąd pobierać kursy walut?


Jedynym wiarygodnym źródłem kursów walut jest Narodowy Bank Polski. Jak powszechnie wiadomo, NBP od bardzo dawna udostępnia na swojej oficjalnej witrynie tabele kursów walut. Od dość niedawna jednak została uruchomiona dodatkowa poddomena NBP http://api.nbp.pl/, pod którą są umieszczane kursy walut w formatach .xml oraz .json dla celów programistycznych. Stąd właśnie będziemy pobierać kursy dla celów przedstawionego tutaj przykładu. Pliki API NBP są generowane po stronie serwera NBP, w sposób zależny od zapytania HTTP wysłanego przez klienta. Warto wstępnie zapoznać się z różnymi, możliwymi parametrami zapytań: http://api.nbp.pl/#kursyParams. Wstępne zapoznanie się z instrukcjami znajdującymi się w witrynie API NBP znacznie ułatwi zrozumienie mojego przykładu.

Jak to działa?


Pod adresem http://api.nbp.pl/api/exchangerates/rates/A/EUR/ znajdują się dane aktualnie obowiązującego średniego kursu Euro. Aby jednak uzyskać informacje dotyczące kursu Euro dla konkretnie wybranej daty, należy dołączyć datę do zapytania, np. http://api.nbp.pl/api/exchangerates/rates/A/EUR/2016-07-22
Należy zwrócić uwagę na fakt, iż możemy w ten sposób uzyskać pliki z danymi kursów, zarówno w formacie JSON jak i XML. Aby zrobiło się trochę ciekawiej, w niniejszym przykładzie posługuję się formatem XML!

Aby uzyskać informacje o kursach w formacie XML należy dodać odpowiedni parametr do naszego przykładowego zapytania: http://api.nbp.pl/api/exchangerates/rates/A/EUR/2016-07-22?format=xml

Gdy klikamy w przycisk "Pobierz i wstaw" w formularzu, którego źródło HTML przedstawiam poniżej, osadzony w sekcji HEAD kod jQuery wywołuje skrypt php api_nbp_tab_A_xml.php, przekazując mu interesującą nas datę w zmiennej $_POST. Skrypt php sprawdza czy szukany przez nas plik xml istnieje w lokalnym katalogu, a jeśli nie, to stara się go uzyskać ze zdalnego serwera NBP. Jeśli plik ze średnim kursem naszej przykładowej waluty, dla wybranej daty, nie został już uprzednio skopiowany na nasz lokalny katalog, skrypt php api_nbp_tab_A_xml.php stara się odnaleźć takowy zdalny plik kursu średniego Euro dla wybranej przez nas daty, wywołując odpowiednie zapytanie HTTP. Jeśli plik zostaje odnaleziony na zdalnym serwerze, skrypt php kopiuje go do lokalnego katalogu /xml, jeśli natomiast plik nie zostaje odnaleziony, wówczas skrypt zwraca odpowiedni komunikat.

W kolejnym etapie skrypt jQuery wysyła lokalne zapytanie XMLHttpRequest, tworząc objekt tej klasy, w celu odniesienia się do ewentualnie skopiowanego lokalnego pliku, po czym, jeśli odpowiedź lokalnego sewera jest pozytywna i plik jest "gotowy" - czyli mamy:
xhttp.readyState == 4 && xhttp.status == 200
, wówczas następuje przetwarzanie zawartości pliku poprzez funkcje getRates() i wydobywanie z niego interesujących nas wartości, które są wstawiane do formularza poprzez:
$("#kurs_euro1").val(rateInt);
$("#kurs_euro2").val(rateDec);
$("#kurs-result").html(tab);
$("#tabela_nbp").val(tab);


Formularz HTML




CSS



Kod jQuery



Skrypt PHP


Oto zawartość wywoływanego przez powyższy kod jQuery skryptu api_nbp_tab_A_xml.php:
define('XML_FILES_PATH', $_SERVER['DOCUMENT_ROOT']."xml/");

function isValidDate($date) {
$d = DateTime::createFromFormat('Y-m-d', $date);
return $d && $d->format('Y-m-d') === $date;
}

function URL_exists($url){
$headers=get_headers($url);
return stripos($headers[0],"200 OK")?true:false;
}

// Jeżeli data jest prawidłowa
if (isValidDate($_POST['data'])) {

// Jeżeli plik xml jeszcze nie istnieje w lokalnym katralogu
if(!file_exists(XML_FILES_PATH.$_POST['data'].".xml")) {

// Jeżeli istnieje dokument xml
if(URL_exists("http://api.nbp.pl/api/exchangerates/rates/A/EUR/".$_POST['data']."?format=xml")) copy("http://api.nbp.pl/api/exchangerates/rates/A/EUR/".$_POST['data']."?format=xml", XML_FILES_PATH.$_POST['data'].".xml");
else die('Tabela nie została odnaleziona!');

if (file_exists(XML_FILES_PATH.$_POST['data'].".xml")) die('Zaimportowano tabelę!'); else die('Proba zaimportowania tabeli nie powiodła się!');

} else die('Tabela istnieje!');

} else die('Proszę wybrać datę!'); -


Działający przykład


Działający przykład przedstawionej tutaj metody można przetestować pod adresem http://kursy-walut.info


Czy artykuł okazał się pomocny?


Jeśli artykuł spodobał się lub okazał się pomocny uprzejmie proszę o udostępnianie go w sieci. W razie pytań służę pomocą. Proszę o komentarze.

sobota, 23 kwietnia 2016

Odzyskiwanie hasła admina Drupal 7

Odzyskiwanie hasła admina w systemie zarządzania zawartością Drupal 7 jest bardzo proste, pod warunkiem, iż system jest w stanie wysłać nam wiadomość z nowym hasłem dostępu. Niestety, nie zawsze wszystko idzie po najlepszej myśli. Od długiego czasu administruję bardzo dużą ilością witryn www, z których spora część to strony oparte na systemie Drupal, więc zdarza mi się niekiedy, iż hasła admina do danej witryny po prostu nie pamiętam, a system z tej lub owej przyczyny nie jest w stanie wysłać mi wiadomości z nowym hasłem, bądź stary adres poczty elektronicznej już od dawna nie jest aktualny, więc hasło nie dociera. Tak czy inaczej, w praktyce tego typu sytuacje mają często miejsce.

Opiszę tutaj jak odzyskać hasło admina do systemu CMS Drupal 7 w przypadku pojawienia się kłopotów z wysłaniem nowego hasła w wiadomości email i nie mając dostępu do Shell'a. Zakładam tutaj jednak możliwość dostępu do katalogu www poprzez FTP, a także dostęp do bazy danych poprzez phpMyAdmin.

Odzyskiwanie hasła admina - Drupal 7



W systemie Drupal 6, w którym hasło admina zabezpieczane było w tabeli bazy danych SQL algorytmem kryptograficznym MD5, odzyskanie hasła w sytuacji opisanej powyżej wiązało się jedynie z wydaniem jednego polecenia SQL w interfejsie phpMyAdmin, np:
 
update users set pass = md5('newpass') where uid = 1;

W systemie Drupal 7, gdzie hasła użytkowników haszowane są za pomocą o wiele bezpieczniejszego od MD5 algorytmu sha512, sytuacja nieco się komplikuje, lecz odzyskanie hasła jest możliwe nadal w sposób dość banalny, pod warunkiem, że wiemy jak to zrobić. Jak więc odzyskać hasło admina Drupal 7 gdy system nie wysyła poczty? Ponadto, skoro nie mamy dostępu do Shell'a to nie możemy wygenerować zahaszowanego ciągu znaków nowego hasła, korzystając ze specjalnego skryptu znajdującego się zestawie skryptów Drupal 7, tak aby wygenerowany w ten sposób ciąg znaków wpisać później do kolumny o nazwie pass w tabeli users, w wierszu odpowiednim użytkownikowi admin, czyli o wartości uid = 1 . Gdy dostęp do Shell'a jest możliwy, wówczas z poziomu głównego katalogu Drupal ciąg znaków odpowiadający zahaszowanemu hasłu można wygenerować w ten oto sposób:

cd scripts;
password-hash.sh 'nowehasloadmina'

Jedyne co nam pozostaje, w sytuacji gdy nie mamy dostępu do Shell'a, a wiadomości z nowym hasłem nie są wysyłane przez system Drupal, to utworzenie skryptu php z odpowiednią zawartością, przesłanie go na główny katalog systemu Drupal poprzez ftp i uruchomienie skryptu w przeglądarce. Oto jaką treść powinien zawierać nasz magiczny skrypt php, który po uruchomieniu w przeglądarce wyświetli nam ciąg znaków odpowiadający zahaszowanemu hasłu:
<?php
define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
require_once 'includes/common.inc';
require_once 'includes/password.inc';
echo user_hash_password('nowehasloadmina');
die();
?>

Otrzymany w ten sposób ciąg znaków należy wprowadzić do kolumny o nazwie pass, w tabeli users, po uprzednim uwierzytelnieniu się w interfejse phpMyAdmin, wydając następujące polecenie SQL:
update users set pass = 'zahaszowanehasloadmina' where uid = 1;

To wszystko na dziś i mam nadzieję, że artykuł okaże się pomocny. Jeśli tak, to z góry dziękuję za udostępnianie.

wtorek, 15 września 2015

Apache mod_authn_dbd: uwierzytelnianie HTTP z wykorzystaniem bazy danych MySql

W niniejszym artykule opiszę jak skonfigurować i wymusić uwierzytelnianie HTTP z poziomu serwera Apache, z użytkownikami i hasłami zapisanymi w tabeli bazy danych MySql. Pomimo iż zadanie wygląda na dość skomplikowane, poradzenie sobie z nim nie wymaga dużej ilości pracy.

Opisane tutaj zagadnienia opracowałem, przetestowałem i zademonstruję w następującym środowisku Linux:

System operacyjny Scientific Linux 7;
Kernel 3.10.0-229.11.1.el7.x86_64;
Serwer www Apache v. 2.4.6;
Server MySql mariadb v. 5.5.44;
apr-util-mysql v. 1.5.2 – pakiet sterownika MySql dla abstrakcyjnego interfejsu DBD bazy danych

Aby zrozumieć i prawidłowo zastosować opisywane tutaj rozwiązania, wymagana jest od czytelników następująca wiedza:

dobra znajomość podstawowych zagadnień Linux;
dobra znajomość konfiguracji serwera Apache;
dobra znajomość serwera i klienta MySql.

Należy zwrócić uwagę, iż w celu przeprowadzenia opisanej tutaj konfiguracji, serwer Apache wymaga obecności modułów mod_auth_basic, mod_authn_core, mod_authn_file, mod_authn_socache, mod_dbd oraz mod_authn_dbd. W celu wdrożenia uwierzytelniania HTTP z wykorzystaniem tabeli MySql pakiet apr-util-mysql powinien zostać zainstalowany.

Jeżeli nie mamy pewności co do obecności wymaganych modułów należy się upewnić czy są one dostępne dla serwera, np. za pomocą narzędzia httpd z parametrem -M.

Aby wyjaśnić zagadnienie w dość przejrzysty i łatwy do zrozumienia sposób, podzielę całą procedurę na dwa etapy. W pierwszym kroku skonfiguruję proste uwierzytelnianie HTTP oparte na funkcjonalności modułu Apache mod_auth_basic, w drugim zaś kroku zmodyfikuję nieco pierwotną konfigurację, dodając do niej funkcjonalność odczytu informacji o użytkownikach z tabeli MySql.

Apache Web Server
Apache Web Server

Krok 1 - Apache mod_auth_basic: podstawowe uwierzytelnianie HTTP Apache


W tym kroku zademonstruję jak przykładowo skonfigurować podstawowe uwierzytelnianie HTTP z poziomu serwera Apache, za pomocą modułu mod_auth_basic. Należy zwrócić uwagę, że zasady bezpieczeństwa wymagałyby jednoczesnego stosowania szyfrowania SSL, co w połączeniu z uwierzytelnianiem mod_auth_basic przyniosłoby naprawdę wysoki poziom bezpieczeństwa jeśli chodzi o przesyłanie nazw użytkowników i haseł w sieci. Zależy zwrócić uwagę, że stosowanie modułu mod_auth_basic wraz z szyfrowaniem SSL jest o wiele bezpieczniejsze niż stosowanie uwierzytelniania opartego o sam moduł mod_auth_digest, który niegdyś był jednak o wiele bezpieczniejszy niż mod_auth_basic, ale dziś już tak nie jest.

Przytoczę przykład podstawowego uwierzytelniania HTTP dla ścieżki /var/www/html.

Aby rozpocząć należy dodać do pliku httpd.conf następujące linie:
<Directory "/var/www/html/zabezpieczony">
    AllowOverride None
    AuthType Basic
    AuthName "Strefa zabezpieczona"
    AuthBasicProvider file
    AuthUserFile /etc/httpd/users_zabezpieczony
    Require user michael
</Directory>
Co oznaczają te wszystkie dyrektywy? Otóż ich znaczenie jest następujące:

Directory: w sekcji <Directory>, która powinna być ograniczona znacznikami <Directory "katalog"></Directory>, umieszcza się ustawienia dotyczące określonego katalogu. 

AllowOverride: ta ważna dyrektywa z parametrem None zabezpiecza konfigurację katalogu przed nadpisaniem jej ustawień wpisami w pliku .htaccess, umieszczonym bezpośrednio w danym katalogu. Warto tutaj zwrócić uwagę, że w przypadku konieczności stosowania ustawień dotyczących uwierzytelniania bezpośrednio w pliku .htaccess, na przykład z powodu ograniczonego dostępu do plików konfiguracyjnych serwera Apache, wówczas w pliku httpd.conf, w sekcji dotyczącej danego katalogu, powinna się znajdować dyrektywa AllowOverride z parametrem AuthConfig.

AuthType Basic: określa metodę uwierzytelniania HTTP. W tym przypadku jest to podstawowe uwierzytelnianie.

AuthName: dyrektywa określa nazwę, która ma się wyświetlać w okienku uwierzytelniania. W naszej przykładowej konfiguracji jest to „Strefa zabezpieczona”.

AuthBasicProvider: dyrektywa określa metodę przechowywania nazw użytkowników i haseł dla skonfigurowanego dla danego katalogu uwierzytelniania HTTP. W naszej przykładowej konfiguracji ustawiamy metodę "file", co oznacza, że nazwy użytkowników i ich hasła mają być przechowywane w specjalnym pliku, który za chwilę utworzymy.

AuthUserFile: określa lokalizację pliku z nazwami użytkowników i ich zaszyfrowanymi hasłami. W naszej przykładowej konfiguracji jest to /etc/httpd/users_zabezpieczony

Require: dyrektywa określająca uprawnionych użytkowników, którzy mają mieć dostęp do katalogu. W naszej przykładowej konfiguracji dostęp do katalogu ma mieć wyłącznie użytkownik o nazwie michael.

Jeżeli katalog /var/www/html/zabezpieczony jeszcze nie istnieje to należy go teraz utworzyć. Własność i uprawnienia do katalogu powinny wyglądać następująco:
drwxr-xr-x 2 apache apache    6 Sep 14 09:00 zabezpieczony
Następnie należy utworzyć plik przechowujący nazwy użytkowników i ich zaszyfrowane hasła. Należy to zrobić za pomocą polecenia htpasswd:
[michael@sphera3]$ htpasswd -c /etc/httpd/users_zabezpieczony michael
New password:
Re-type new password:
Adding password for user michael
Dla wygenerowanego pliku należy następnie ustawić odpowiedniego właściciela, grupę, oraz uprawnienia:
-rw-r-----   1 apache apache   46 Sep 14 09:04 users_zabezpieczony
Nowe ustawienia, zapisane w pliku konfiguracyjnym serwera Apache, zaczną obowiązywać po ponownym uruchomieniu serwera, a więc:
[michael@sphera3]$ systemctl restart httpd
Zgodnie z przeprowadzoną konfiguracją próba dostępu do zabezpieczonego katalogu www uruchamia proces uwierzytelniania HTTP. Aby się o tym przekonać wystarczy wpisać do paska adresów przeglądarki adres serwera i ścieżkę prowadzącą do zabezpieczonego katalogu.

Krok 2 – Apache mod_authn_dbd: uwierzytelnianie HTTP Apache z użytkownikami w tabeli MySql


W tym kroku nauczymy się jak skonfigurować serwer Apache do uwierzytelniania HTTP, tak aby nazwy i zaszyfrowane hasła użytkowników mogły być przechowywane w odpowiedniej tabeli bazy danych MySql. Tego typu rozwiązanie jest nieco bardziej złożone niż to, które zostało opisane w poprzednim kroku.

Uwaga: w sieci można znaleźć obfitą ilość instruktarzy dotyczących tego zagadnienia. Wiele z nich, jak udało mi się ustalić, prowadzi do różnego rodzaju błędów, które mogą powodować. Przykładowo, najczęściej powodują one generowanie następujących komunikatach o błędach w logach serwera Apache:
[dbd:crit] [pid 9253] (20014)Internal error: AH00636: child init failed! [dbd:error] [pid 9250] (20014)Internal error: AH00629: Can't connect to mysql: Access denied for user 'apache'@'localhost' (using password: NO)
Aby prawidłowo skonfigurować uwierzytelnianie HTTP Apache z wykorzystaniem bazy danych MySql, poprzednią konfigurację uwierzytelniania HTTP dotyczącą naszego katalogu należy zmienić w następujący sposób:
DBDriver mysql
DBDParams "host=localhost,dbname=apache,user=apache,pass=tajne_haslo_apacha"
DBDMin  1
DBDKeep 1
DBDMax 10
DBDExptime 300
DBDPersist On

<Directory "/var/www/html/zabezpieczony">
  AuthType Basic
  AuthName "Strefa zabezpieczona"
  AuthBasicProvider socache dbd
  AuthnCacheProvideFor dbd
  AuthnCacheContext strefa_zabezpieczona
  Require valid-user
  AuthDBDUserPWQuery "SELECT password FROM authn WHERE user = %s"
</Directory>
Powyżej przedstawione dyrektywy DBD powinny znajdować się w pliku httpd.conf i nie mogą być zamknięte w jakichkolwiek konkretnych sekcjach, np. sekcjach <Directory>. Dyrektywy DBD określają sterownik bazy danych, nazwę użytkownika i hasło oraz kilka innych parametrów związanych z serwerem bazodanowym.

Co oznaczają dyrektywy z powyższej sekcji <Directory>, zwłaszcza, że jest ich o wiele więcej niż w przykładzie z pierwszego kroku?

AuthBasicProvider: dyrektywa ta, wraz z parametrami socache i dbd instruuje serwer Apache do odczytywania nazw użytkowników i ich haseł z serwera bazy danych oraz, w miarę możliwości, ze specjalnej pamięci podręcznej (mod_authn_socache) w celu zmniejszenia częstotliwości odczytu tabeli bazy danych.

AuthnCacheProvideFor oraz  AuthnCacheContext: te dyrektywy związane są z konfiguracją specjalnej pamięci podręcznej dla zabezpieczanego katalogu, jak wyjaśniłem powyżej.

AuthDBDUserPWQuery: ta dyrektywa określa zapytanie SQL stosowane do odczytania hasła dla nazwy użytkownika wprowadzonej w trakcie procesu uwierzytelniania.

Znaczenie pozostałych dyrektyw konfiguracji opisywanej w tym kroku przedstawiłem w wyjaśnieniach do pierwszego kroku naszej konfiguracji.

Po zapisaniu powyżej przedstawionej konfiguracji należy ponownie uruchomić serwer Apache.

Należy teraz utworzyć bazę danych i tabelę MySql, które będą wykorzystywane w procesie uwierzytelniania HTTP, zgodnie z ustawionymi w powyższej konfiguracji parametrami dyrektyw DBDParams oraz AuthDBDUserPWQuery. W tym celu należy uruchomić klienta MySql jako użytkownik root i wydać następujące polecenia:
MariaDB [(none)]> create database apache;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> use apache;
Database changed
MariaDB [apache]> create table authn (
    -> user varchar(20) not null,
    -> password char(38) not null ) engine = InnoDB charset utf8;
Query OK, 0 rows affected (0.06 sec)
W tym przykładzie zastosuje szyfrowanie haseł metodą MD5. Należy zwrócić szczególną uwagę na fakt, iż przechowywane w tabeli bazy danych hasła użytkowników muszą być zakodowane w jednym z rozpoznawanych przez Apache formatów haseł! Dlatego pole password ma mieć długość 38 znaków, zamiast typowej dla MD5 długości 32 znaków. Jeśli hasła mają być zakodowane algorytmem MD5, nie wystarczy zakodować ich tym algorytmem z wiersza poleceń MySql! Apache obsługuje swój specyficzny format MD5. Aby dowiedzieć się więcej na ten temat warto przeczytać ten dokument.

Dla celów niniejszego przykładu zakoduję hasła w specyficznym dla Apache formacie algorytmu MD5, posługując się w tym celu narzędziem htpasswd:
[michael@sphera3]$ htpasswd -nbm HTTPUser1 HTTPPassword1
HTTPUser1:$apr1$IWNLcKto$RkkBvlQ.cAS85wjHi8mUu/

[michael@sphera3]$ htpasswd -nbm HTTPUser2 HTTPPassword2
HTTPUser2:$apr1$mYBsnAnx$of8v/VS.ja1i0I2dh0j8n1
Następnie należy wprowadzić kilka przykładowych użytkowników z zaszyfrowanymi w formacie Apache-md5 hasłami do nowo utworzonej tabeli:
MariaDB [apache]> insert into authn values('HTTPUser1',”$apr1$IWNLcKto$RkkBvlQ.cAS85wjHi8mUu/”),('HTTPUser2',”$apr1$mYBsnAnx$of8v/VS.ja1i0I2dh0j8n1”);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0
Nasza przykładowa tabela powinna teraz zawierać 2 wiersze danych:
MariaDB [apache]> select * from authn;
+---------------+---------------------------------------------------------------+
| user               | password                                                                     |
+---------------+---------------------------------------------------------------+
| HTTPUser1  | $apr1$IWNLcKto$RkkBvlQ.cAS85wjHi8mUu/      |
| HTTPUser2  | $apr1$mYBsnAnx$of8v/VS.ja1i0I2dh0j8n1             |
+---------------+---------------------------------------------------------------+
2 rows in set (0.00 sec)
Po pomyślnym wprowadzeniu nazw użytkowników i ich zaszyfrowanych haseł do tabeli authn, należy utworzyć użytkownika apache@localhost dla serwera MySql, nadać mu hasło zgodnie z dyrektywą DBDParams naszej przykładowej konfiguracji i uprawnić użytkownika apache@localhost do odczytywania danych z tabeli authn:
MariaDB [apache]> grant usage on *.* to apache@localhost identified by "tajne_haslo_apacha";
Query OK, 0 rows affected (0.00 sec)

MariaDB [apache]> grant select on apache.authn to apache@localhost;
Query OK, 0 rows affected (0.00 sec)
Wszystko jest już gotowe i można sprawdzić czy rzeczywiście konfiguracja działa. Utwórzmy testowy plik index.html zawierający jakąkolwiek treść, np. „HELLO” i wrzućmy go do zabezpieczonego katalogu:
-rw-r--r-- 1 apache apache  7 Sep 15 12:19 index.html
Po wywołaniu pliku w przeglądarce, powinno się pojawić okienko uwierzytelniania, do którego należy wprowadzić jednego z utworzonych użytkowników oraz jego niezaszyfrowane hasło, czyli np. HTTPUser1 i HTTPPassword1:

Apache - Uwierzytelnianie HTTP z wykorzystaniem bazy danych MySql
Apache - Uwierzytelnianie HTTP z wykorzystaniem bazy danych MySql


W przypadku jakichkolwiek pytań służę pomocą. Proszę o komentarze!