Apache服務器的用戶認證 (轉)
Jun 21, 2016 am 09:14 AMapache|服務器
經常上網的讀者會遇到這種情況:訪問一些網站的某些資源時,瀏覽器彈出一個對話框,要求輸入用戶名和密碼來獲取對資源的訪問。這就是用戶認證的一種技術。用戶認證是保護網絡系統(tǒng)資源的第一道防線,它控制著所有登錄并檢查訪問用戶的合法性,其目標是僅讓合法用戶以合法的權限訪問網絡系統(tǒng)的資源。基本的用戶認證技術是“用戶名+密碼”。
Apache是目前流行的Web服務器,可運行在Linux、Unix、Windows等操作系統(tǒng)下,它可以很好地解決“用戶名+密碼”的認證問題。Apache用戶認證所需要的用戶名和密碼有兩種不同的存貯方式:一種是文本文件;另一種是MSQL、Oracle、MySQL等數據庫。下面以Linux的Apache為例,就這兩種存貯方式,分別介紹如何實現用戶認證功能,同時對Windows的Apache用戶認證作簡要的說明。
采用文本文件存儲
這種認證方式的基本思想是:Apache啟動認證功能后,就可以在需要限制訪問的目錄下建立一個名為.htaccess的文件,指定認證的配置命令。當用戶第一次訪問該目錄的文件時,瀏覽器會顯示一個對話框,要求輸入用戶名和密碼,進行用戶身份的確認。若是合法用戶,則顯示所訪問的頁面內容,此后訪問該目錄的每個頁面,瀏覽器自動送出用戶名和密碼,不用再輸入了,直到關閉瀏覽器為止。以下是實現的具體步驟:
以超級用戶root進入Linux,假設Apache 1.3.12已經編譯、安裝到了/usr/local/apache目錄中。缺省情況下,編譯Apache時自動加入mod_auth模塊,利用此模塊可以實現“用戶名+密碼”以文本文件為存儲方式的認證功能。
1.修改Apache的配置文件/usr/local/apache/conf/httpd.conf,對認證資源所在的目錄設定配置命令。下例是對/usr/local/apache/htdocs/members目錄的配置:
?。糄irectory /usr/local/apache/htdocs /members>
Options Indexes FollowSymLinks
allowoverride authconfig
order allow,deny
allow from all
?。?Directory>
其中,allowoverride authconfig一行表示允許對/usr/local/apache/htdocs/ members目錄下的文件進行用戶認證。
2.在限制訪問的目錄/usr/local/apache/htdocs/members下建立一個文件.htaccess,其內容如下:
AuthName "會員區(qū)"
AuthType basic
AuthUserFile/usr/local/apache/members.txt
require valid-user
說明:文件.htaccess中常用的配置命令有以下幾個:
1) AuthName命令:指定認證區(qū)域名稱。區(qū)域名稱是在提示要求認證的對話框中顯示給用戶的(見附圖)。
2)AuthType命令:指定認證類型。在HTTP1.0中,只有一種認證類型:basic。在HTTP1.1中有幾種認證類型,如:MD5。
3) AuthUserFile命令:指定一個包含用戶名和密碼的文本文件,每行一對。
4) AuthGroupFile命令:指定包含用戶組清單和這些組的成員清單的文本文件。組的成員之間用空格分開,如:
managers:user1 user2
5) require命令:指定哪些用戶或組才能被授權訪問。如:
require user user1 user2(只有用戶user1和user2可以訪問)
requiresgroupsmanagers (只有組managers中成員可以訪問)
require valid-user (在AuthUserFile指定的文件中任何用戶都可以訪問)
3.利用Apache附帶的程序htpasswd,生成包含用戶名和密碼的文本文件:/usr/local/apache/members.txt,每行內容格式為“用戶名:密碼”。
#cd /usr/local/apache/bin
#htpasswd -bc ../members.txt user1 1234
#htpasswd -b ../members.txt user2 5678
文本文件members.txt含有兩個用戶:user1,口令為1234;user2,口令為5678。注意,不要將此文本文件存放在Web文檔的目錄樹中,以免被用戶下載。
欲了解htpasswd程序的幫助,請執(zhí)行htpasswd -h。
當用戶數量比較少時,這種方法對用戶的認證是方便、省事的,維護工作也簡單。但是在用戶數量有數萬人,甚至數十萬人時,會在查找用戶上花掉一定時間,從而降低服務器的效率。這種情形,應采用數據庫方式。
采用數據庫存儲
目前,Apache、PHP4、MySQL三者是Linux下構建Web網站的最佳搭檔,這三個軟件都是免費軟件。將三者結合起來,通過HTTP協議,利用PHP4和MySQL,實現Apache的用戶認證功能。
只有在PHP4以Apache的模塊方式來運行的時候才能進行用戶認證。為此,在編譯Apache時需要加入PHP4模塊一起編譯。假設PHP4作為Apache的模塊,編譯、安裝Apache到/usr/local/apache目錄,編譯、安裝MySQL到/usr/local/mysql目錄。然后進行下面的步驟:
1.在MySQL中建立一個數據庫member,在其中建立一個表users,用來存放合法用戶的用戶名和密碼。
1)用vi命令在/tmp目錄建立一個SQL腳本文件auth.sql,內容為:
drop database if exists member;
create database member;
use member;
create table users (
username char(20) not null,
password char(20) not null,
);
insertsintosusers values("user1",password("1234"));
insertsintosusers values("user2",password("5678"));
2)啟動MySQL客戶程序mysql,執(zhí)行上述SQL腳本文件auth.sql的命令,在表users中增加兩個用戶的記錄。
#mysql -u root -pmypwd</tmp/auth.sql
2.編寫一個PHP腳本頭文件auth.inc,程序內容為:
<?php
function authenticate() {
Header('WWW-authenticate: basic realm="會員區(qū)"');
Header('HTTP/1.0 401 Unauthorized');
echo "你必須輸入正確的用戶名和口令。 ";
exit;
}
function CheckUser(, ) {
if ( == "" || == "") return 0;
= "SELECT username,password FROM usersswheresusername='' and password=password('')";
= mysql_connect('localhost', 'root', 'mypwd');
mysql_select_db('member',);
= mysql_query(, );
=mysql_num_rows();
mysql_close();
if (>0) {
return 1; //有效登錄
} else {
return 0; //無效登錄
}
}
?>
函數Authenticate()的作用是利用函數Header('WWW-authenticate: basic realm="會員區(qū)"'),向瀏覽器發(fā)送一個認證請求消息,使瀏覽器彈出一個用戶名/密碼的對話框。當用戶輸入用戶名和密碼后,包含此PHP腳本的URL將自動地被再次調用,將用戶名、密碼、認證類型分別存放到PHP4的三個特殊變量:、、,在PHP程序中可根據這三個變量值來判斷是否合法用戶。Header()函數中,basic表示基本認證類型,realm的值表示認證區(qū)域名稱。
函數Header('HTTP/1.0 401 Unauthorized')使瀏覽器用戶在連續(xù)多次輸入錯誤的用戶名或密碼時接收到HTTP 401錯誤。
函數CheckUser()用來判斷瀏覽器用戶發(fā)送來的用戶名、密碼是否與MySQL數據庫的相同,若相同則返回1,否則返回0。其中mysql_connect('localhost', 'root', 'mypwd')的數據庫用戶名root和密碼mypwd,應根據自己的MySQL設置而改變。
3.在需要限制訪問的每個PHP腳本程序開頭增加下列程序段:
?。?php
require('auth.inc');
if (CheckUser(,)==0) {
authenticate();
} else {
echo "這是合法用戶要訪問的網頁。"; //將此行改為向合法用戶輸出的網頁
}
?>
把需要向合法用戶顯示的網頁內容放到else子句中,取代上述程序段的一行:
echo "這是合法用戶要訪問的網頁。";
這樣,當用戶訪問該PHP腳本程序時,需要輸入用戶名和密碼來確認用戶的身份。
Windows的Apache用戶認證
1.采用文本文件存放用戶名和密碼時,其方法同前,但需要注意的是表示路徑的目錄名之間、目錄名與文件名之間一律用斜線“/”分開,而不是反斜線“”。
2.采用MySQL數據庫存放用戶名和密碼時,首先按下列方法將PHP 4.0.3作為Apache的模塊來運行,然后按上述“采用數據庫存儲用戶名和密碼的用戶認證”的方法完成。
1)下載Windows版的Apache 1.3.12、PHP 4.0.3、MySQL 3.2.32,將三個軟件分別解壓、安裝到C:pache、C:PHP4、C:mysql目錄。
2) C:PHP4SAPI目錄有幾個常用Web服務器的PHP模塊文件,將其中php4apache.dll拷貝到Apache的modules子目錄(C:pachemodules)。
3)修改Apache的配置文件C:pachenfhttpd.conf,增加以下幾行:
LoadModule php4_module modules/ php4apache.dll
AddType application/x-httpd-php .php3
AddType application/x-httpd-php-source .phps
AddType application/x-httpd-php .php
第一行使PHP4以Apache的模塊方式運行,這樣才能進行用戶認證,后三行定義PHP腳本程序的擴展名。
4)在autoexec.bat文件的PATH命令中增加PHP4所在路徑“C:PHP4”,重新啟動電腦。
經我測試,2.0版本的apache不成

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

STD :: Chrono digunakan dalam C untuk memproses masa, termasuk mendapatkan masa semasa, mengukur masa pelaksanaan, titik masa operasi dan tempoh, dan masa analisis pemformatan. 1. Gunakan std :: chrono :: system_clock :: sekarang () untuk mendapatkan masa semasa, yang boleh ditukar menjadi rentetan yang boleh dibaca, tetapi jam sistem mungkin tidak membosankan; 2. Gunakan std :: chrono :: steady_clock untuk mengukur masa pelaksanaan untuk memastikan monoton, dan mengubahnya menjadi milisaat, saat dan unit lain melalui duration_cast; 3. Titik masa (time_point) dan tempoh (tempoh) boleh saling beroperasi, tetapi perhatian harus dibayar kepada keserasian unit dan zaman jam (Epoch)

ToAccessenVironmentVariablesInphp, useGetenv () orthe $ _envsuperglobal.1.getenv ('var_name') retrievesaspecificvariable.2. $ _ En V ['var_name'] AccessSvariablesifvariables_orderinphp.iniincludes "e" .setVariablesviacliwithvar = valuePhpscript.php, inapach

CTE adalah hasil sementara yang ditetapkan dalam MySQL yang digunakan untuk memudahkan pertanyaan kompleks. Ia boleh dirujuk beberapa kali dalam pertanyaan semasa, meningkatkan kebolehbacaan dan penyelenggaraan kod. Sebagai contoh, apabila mencari pesanan terkini untuk setiap pengguna dalam jadual pesanan, anda boleh terlebih dahulu mendapatkan tarikh pesanan terkini untuk setiap pengguna melalui CTE, dan kemudian mengaitkannya dengan jadual asal untuk mendapatkan rekod lengkap. Berbanding dengan subqueries, struktur CTE lebih jelas dan logik lebih mudah untuk debug. Petua penggunaan termasuk alias eksplisit, menggabungkan pelbagai CTE, dan memproses data pokok dengan CTE rekursif. Menguasai CTE boleh menjadikan SQL lebih elegan dan cekap.

PhphasthreecommentStyles: //,#forsingle-lineand/.../formulti-line.usecommentstoexplainwhycodeexists ,notwhatitdoes.marktodo/fix MeitemsanddisableCodeTemporaryDuringDebugging.avoidover-CommentingsImpleLogic.writeConcise, GrammaticallyCorrectcommentsandu

Terdapat tiga cara utama untuk mengelakkan ralat "UndefinedIndex": pertama, gunakan isset () untuk memeriksa sama ada kunci array wujud dan memastikan bahawa nilai itu tidak null, yang sesuai untuk senario yang paling biasa; Kedua, gunakan array_key_exists () untuk hanya menentukan sama ada kunci wujud, yang sesuai untuk situasi di mana kunci tidak wujud dan nilainya adalah batal; Akhirnya, gunakan pengendali gabungan kosong ?? (Php7) untuk menetapkan nilai lalai, yang disyorkan untuk projek PHP moden, dan memberi perhatian kepada ejaan nama medan borang, menggunakan ekstrak () dengan teliti, dan periksa array tidak kosong sebelum melintasi untuk mengelakkan lagi risiko.

Apabila menggunakan penyataan pra -proses PHP untuk melaksanakan pertanyaan dengan klausa, 1. Dinamiknya menjana ruang letak mengikut panjang array; 2. Apabila menggunakan PDO, anda boleh lulus secara langsung dalam array, dan gunakan array_values untuk memastikan indeks berterusan; 3. Apabila menggunakan MySQLI, anda perlu membina rentetan jenis dan mengikat parameter, memberi perhatian kepada cara mengembangkan keserasian array dan versi; 4. Elakkan splicing SQL, memproses tatasusunan kosong, dan memastikan jenis data sepadan. Kaedah khusus ialah: penggunaan pertama implode dan array_fill untuk menjana ruang letak, dan kemudian mengikat parameter mengikut ciri -ciri lanjutan untuk melaksanakan dengan selamat dalam pertanyaan.

Whensettingupmysqltables, memilihTheRightDatypesiscialforfiencyandscalability.1) pemahamanThedataeachcolumnwillstore-umbers, text, date, orflags-andchooseaccordingly.2)

Alasan dan penyelesaian untuk fungsi header kegagalan lompat: 1. Terdapat output sebelum tajuk, dan semua pra-output perlu diperiksa dan dikeluarkan atau penampan OB_Start () digunakan; 2. Kegagalan untuk menambah keluar menyebabkan gangguan kod berikutnya, dan keluar atau mati harus ditambah sebaik sahaja lompatan; 3. Kesalahan jalan harus digunakan untuk memastikan ketepatan dengan menggunakan laluan mutlak atau splicing dinamik; 4. Konfigurasi pelayan atau gangguan cache boleh cuba membersihkan cache atau menggantikan ujian persekitaran.
