apache: An einer mySQL Datenbank authentifizieren

Die Methode mit .htaccess/.htpasswd ist vielen bekannt um ein Verzeichnis per passwort zu schützen – Und dies geht mit dem apache-modul: mod_auth_mysql auch über eine mysql Datenbank!

Die Möglichkeiten dieser Methode sind fast unerschröpflich, so kann z.B. ein Forum einen Verzeichnisschutz implementiert haben, bei dem man sich automatisch mit seinem normalen Foren-Login anmelden kann, usw.

Und so gehts:

Erst mal muss das mod_auth_mysql installiert werden, z.B. bei CentOS mittels:

yum install mod_auth_mysql

Dann legt man im zu schützenden Verzeichnis einfach ein normales .htaccess file an mit folgendem Inhalt:

AuthName "SeitenName"
AuthType Basic
AuthMySQLHost <DB_HOST>
AuthMySQLUser <DB_USER>
AuthMySQLPassword <DB_PASSWORT>
 
AuthMySQLDB <DB>
AuthMySQLUserTable <USER_TABELLE>
AuthMySQLNameField <FELD_NAME>
AuthMySQLPasswordField <FELD_PASSWORT>
AuthMySQLPwEncryption <passwort Verschlüsselung, z.B. md5>
AuthMySQLEnable On
AuthMySQLUserCondition "<ggf. weitere Kontitionen>"
require valid-user

Hier ist noch ein Beispiel, wie man das ganze auch auf Gruppenberechtigungen ausdehnen kann:

AuthName "YourSite"
AuthType Basic
 
# Database settings:
AuthMySQLHost localhost
AuthMySQLUser dbuser
AuthMySQLPassword dbpass
AuthMySQLDB dbname
 
# User table
AuthMySQLUserTable users
AuthMySQLNameField users.name
AuthMySQLPasswordField users.pass
 
# User Roles tables
AuthMySQLGroupTable "users, users_roles"
AuthMySQLGroupField users_role.rid
 
# Where clauses
AuthMySQLUserCondition "users.status = 1 and users.access <> 0"
AuthMySQLGroupCondition "users.uid = users_roles.uid AND users_roles.rid > 2"
 
# Do it to it!
AuthMySQLPwEncryption md5
AuthMySQLEnable On
require valid-user

Und wenn alles klappt kann man sich dann mit den Login-Daten aus der Datenbank anmelden! 😉

Quelle: [http://drupal.org/node/156547|drupal.org: Sharing authentication with HTTP-Auth]

postfix-mysql: queue file write error / Temporary lookup failure

Nachdem ich mein Postfix für die Verwendung mit mysql Tabellen konfiguriert hatte, bekam ich auf einmal beinahe täglich mails, die den Text: "451 4.3.0 Error: queue file write error" und/oder: "Temporary lookup failure" enthielten:

Transcript of session follows.
 
 Out: 220 mail.domain.tld ESMTP Postfix
 In:  EHLO [X.X.X.X]
 Out: 250-mail.domain.tld
 Out: 250-PIPELINING
 Out: 250-SIZE 10240000
 Out: 250-VRFY
 Out: 250-ETRN
 Out: 250-AUTH PLAIN LOGIN
 Out: 250-AUTH=PLAIN LOGIN
 Out: 250-ENHANCEDSTATUSCODES
 Out: 250-8BITMIME
 Out: 250 DSN
 In:  AUTH PLAIN XXXXXXXXXXXXXXXXXXXXXXX
 Out: 235 2.0.0 Authentication successful
 In:  MAIL FROM:<sender@example.org> SIZE=1037
 Out: 250 2.1.0 Ok
 In:  RCPT TO:<empfaenger@example.org>
 Out: 250 2.1.5 Ok
 In:  DATA
 Out: 354 End data with <CR><LF>.<CR><LF>
 Out: 451 4.3.0 Error: queue file write error
 
Session aborted, reason: lost connection

Zwar schien alles zu funktionieren und die mails kamen auch immer noch rein, ich wollte jedoch der Meldung nachgehen.

Im maillog wurde ich dann fündig, denn folgende Fehlermeldung tauchte ziemlich oft auf:

warning: mysql query failed: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=

Dies kam davon, weil ich die postfix Datenbank noch auf dem alten Server angelegt hatte und auf dem der Zeichensatz: latin1_swedish_ci standardmässig eingestellt war, beim neuen Server war jedoch UTF8 standard.

Das Problem kann man dann lösen, wenn man die Postfix Datenbank wie folgt konvertiert:

Login auf mysql:

mysql -uroot -p

dann für jede Tabelle:

ALTER TABLE tbl_name CHARACTER SET utf8 COLLATE utf8_general_ci;

und für jedes Textfeld:

ALTER TABLE tbl_name MODIFY email varchar(255) CHARACTER SET utf8;

Quelle