Apache 2.4.3 Login über Datenbank

Alles, was den Apache betrifft, kann hier besprochen werden.

Apache 2.4.3 Login über Datenbank

Postby casi91 » 03. December 2012 09:24

Hallo Community,
ich versuche derzeit den Login meiner Seite nicht mehr über ein php-Skript laufen zu lassen (bzw. nicht ausschließlich darüber), sondern möchte das bestimmte Verzeichnisse die gleiche Loginseite vorgeschaltet bekommen.
Das ganze möchte ich in der Config des Apache hinterlegen.
Außerdem sollen die Benutzerdaten aber nach wie vor mit der Datenbank abgeglichen werden (IMB iSeries AS400, DB2)

Um eine Loginseite für bestimmte Verzeichnisse vorzuschalten arbeite ich mich gerade in "mod_auth_form" ein und habe es hier auch schon geschafft das eine ganze einfache Loginseite vorgeschaltet wird.
Allerdings, hab ich es noch nicht geschafft, den Login irgendwie mit der Datenbank zu verbinden. Hier bin ich auch schon über das Modul "mod_dbd" gestoßen, habe damit bisher aber noch keine Erfolge.

Hat hier jemand schon erfahrungen mit gemacht (evtl. sogar auch im Bezug auf die AS400 / DB2)?

Außerdem habe ich mir überlegt, um es eventuell einfacher hinzubekommen, dass ich meine momentane Login-Seite behalte und diese von dem Apache Server vorschalten lasse. Allerdings müsste ich dem Apache Server dann ja auch irgendwie mitteilen, dass der Login nun korrekt bzw. inkorrekt war. Hier gibt es doch bestimmt auch eine Möglichkeit oder?

Ich hoffe mein Problem ist einigermaßen verständlich und das mir jemand helfen kann :-)
Meine Umgebung:
- Apache 2.4.3
- PHP 5.4.9
- Windows Server 2008 R2

Manuelle Installation ohne XAMPP oder ähnliches.
casi91
 
Posts: 8
Joined: 03. December 2012 09:08
Operating System: Windows Server 2008 R2

Re: Apache 2.4.3 Login über Datenbank

Postby casi91 » 03. December 2012 13:15

Nach längerem rumprobieren, habe ich es nun auch geschafft eine Verbindung zur DB2 herzustellen.
War an und für sich nicht schwer.
Eine DSN im System mit den Verbindungsinformationen hinterlegt, mod_auth_dbd eingebunden und die httpd.conf folgendermaßen angepasst:
Code: Select all
DBDriver odbc
DBDParams "DATASOURCE=DSNName, USER=xxx, PASSWORD=xxxxl"

DBDMin  4
DBDKeep 8
DBDMax  20
DBDExptime 300
<Directory "xxxxxxx">
   # core authentication and mod_auth_basic configuration
   # for mod_authn_dbd
   AuthFormProvider dbd
   AuthType form
   AuthName "My Server"
   Session On
   SessionCookieName session path=/    

   # core authorization configuration
   Require valid-user

   # mod_authn_dbd SQL query to authenticate a user
   AuthDBDUserPWQuery \
      "SELECT password FROM tabelle WHERE user = %s"   
   ErrorDocument 401 /login.php   
</Directory>


Einziges Problem ist nun, dass ich noch nicht herausgefunden habe, wie er das Passwort dann verschlüsselt.
Ich bekomme immer ein "password missmatch" im error-log.

Es gibt ja 4 Varianten: http://httpd.apache.org/docs/2.2/misc/password_encryptions.html
Habe jetzt alle mal manuell durchgearbeitet aber irgendwie hat es nie funktioniert.
Die Verbindung zur DB besteht definitiv, weil wenn ich einen nicht vorhandenen Benutzer angebe, steht das entsprechend auch in der error-log drin.

Damit irgendjemand erfahrung?
Meine Umgebung:
- Apache 2.4.3
- PHP 5.4.9
- Windows Server 2008 R2

Manuelle Installation ohne XAMPP oder ähnliches.
casi91
 
Posts: 8
Joined: 03. December 2012 09:08
Operating System: Windows Server 2008 R2

Re: Apache 2.4.3 Login über Datenbank

Postby Nobbie » 03. December 2012 13:18

casi91 wrote:Außerdem habe ich mir überlegt, um es eventuell einfacher hinzubekommen, dass ich meine momentane Login-Seite behalte und diese von dem Apache Server vorschalten lasse. Allerdings müsste ich dem Apache Server dann ja auch irgendwie mitteilen, dass der Login nun korrekt bzw. inkorrekt war. Hier gibt es doch bestimmt auch eine Möglichkeit oder?


Das sollte relativ einfach gehen, hier die offizielle Doku dazu mit vielen plakativen Beispielen:

http://php.net/manual/de/features.http-auth.php

Was das ursprüngliche Konzept betrifft (alles in Apache Modulen auszulagern), habe ich mich mal durch die Doku gelesen und komme nur bis einer bestimmten Stelle:

a) mod_authn_form als Einstieg ist soweit klar

b) um dort überhaupt einen SQL-Datenbankzugriff zu ermöglichen (statt einfach eine Test Userdatei zu benutzen) muss offensichtlich beim Parameter "Provider" nicht der Wert "file" angegeben werden, sondern "dbd"

c) dadurch wird das Module mod_authn_dbd aktiviert, welches seinerseits auf mod_dbd zurückgreift. In den Parametern von mod_authn_dbd gibt es mit "DBDriver" die Möglichkeit, den SQL Datenbanktreiber zu spezifizieren, siehe http://httpd.apache.org/docs/2.4/mod/mod_authn_dbd.html

Als Beispiele werden die Treiber "pgsql" und "mysql" genannt - die wiederum auf Module der Form apr_dbd_mysql.so usw. zugreifen. Und genau hört die Doku auf, wenn es spannend wird: es müßte an dieser Stelle möglich sein, den Treibe "db" oder auch "db2" oder wie auch immer (ich habe leider keine DB2 Datenbank hier und auch keine Treiber) angegeben werden und man müßte die entsprechenden Treibermodule installiert haben. Ich habe keine Ahnung, ob es die gibt, wenn ja, wo es die gibt usw.

Ansonsten wäre die Abfragesyntax eigentlich klar, das ist da alles ganz gut dokumentiert.
Nobbie
 
Posts: 8758
Joined: 09. March 2008 13:04

Re: Apache 2.4.3 Login über Datenbank

Postby casi91 » 03. December 2012 14:29

Erst mal vielen Dank für deine Antwort.
Anscheinend hast du meinen letzten Post nicht mehr gelesen bzw. warst gerade am Tippen als ich diesen abegschickt habe.
Also die Verbindung mit DB2 funktioniert, wenn der richtige Treiber auf dem Rechner installiert ist und man eine DSN anlegt. (Siehe vorheriger Post)
Einziges Problem das ich noch habe, ist wie oben beschrieben die Verschlüsselung.

In meiner error.log steht (egal wie ich das Passwort bisher abgespeicher habe) diese Meldung
[Mon Dec 03 13:55:39.330524 2012] [auth_basic:error] [pid 3824:tid 1348] [client 1x.x.x.x:xxxx] AH01617: user xxxx: authentication failure for "/testfolder/authorized.php": Password Mismatch


Ich suche die ganze Zeit nach einer Option, um wenigstens selbst festlegen zu können, ob ich nun SHA1, MD5 oder Plaintext verwenden will.
Jedoch habe ich hier noch keine Einstellung gefunden.
Leider hört die Doku auch auf bei AuthType Basic und Digest und somit weiß ich nicht, welche Verschlüsselung bei AuthType form verwendet wird.

Gibt es hier irgendwie die Möglichkeit zu sagen, wie ich verschlüsseln will?
Irgendwas in der richtung "AuthCrypt plainText" zum Beispiel.
Meine Umgebung:
- Apache 2.4.3
- PHP 5.4.9
- Windows Server 2008 R2

Manuelle Installation ohne XAMPP oder ähnliches.
casi91
 
Posts: 8
Joined: 03. December 2012 09:08
Operating System: Windows Server 2008 R2

Re: Apache 2.4.3 Login über Datenbank

Postby casi91 » 03. December 2012 15:39

Hab es nun hinbekommen.
Hier meine Lösung:
Code: Select all
   
AuthDBDUserPWQuery \
      "SELECT TRIM(pwd) FROM tabelle WHERE user = %s"


Hätte ich vor 2 Stunden schonmal TRIM eingebaut hätte ich mir viele nerven ersparrt...
Und das Passwort habe ich folgendermaßen generiert (mit php):
Code: Select all
'{SHA}' . base64_encode(sha1($password, TRUE));


der rest meiner Config ist so wie oben geschrieben geblieben.
Endlich hab ich mal die Grundfunktion meines neuen Logins ^.^
Meine Umgebung:
- Apache 2.4.3
- PHP 5.4.9
- Windows Server 2008 R2

Manuelle Installation ohne XAMPP oder ähnliches.
casi91
 
Posts: 8
Joined: 03. December 2012 09:08
Operating System: Windows Server 2008 R2

Re: Apache 2.4.3 Login über Datenbank

Postby Nobbie » 03. December 2012 16:18

casi91 wrote:Und das Passwort habe ich folgendermaßen generiert (mit php):
Code: Select all
'{SHA}' . base64_encode(sha1($password, TRUE));



Ja, das steht da auch der Seite, dass das Deinem Fall der Standard ist. Wieso mußt Du das Passwort aus dem Select trimmen? Sind da Leerzeichen dran (oder vorneweg)?

Ich kann jetzt nur auf die Schnelle nicht entdecken, wie man das Login nun "dynamisch" gestaltet - im Moment wird die UserID ja vie DBParams vorgegeben, das ist natürlich unbrauchbar in der Realität. Das ist die einzige Stelle, wo ich in der Apache Doku noch kein durchgehendes Beispiel gefunden habe.
Nobbie
 
Posts: 8758
Joined: 09. March 2008 13:04

Re: Apache 2.4.3 Login über Datenbank

Postby casi91 » 03. December 2012 17:03

Die Stelle, wo das steht habe ich nicht gefunden :shock: Hab ich wohl überlesen.
Hab die entsprechenden Informationen nur für Basic und Digest gefunden, aber nicht für Form.

Und das DB-Feld ist ein wenig größer wie der letzten endes generierte sha-wert und da wird bei der db2 entweder der rest mit leerzeichen aufgefüllt oder es wird falsch ausgelesen über odbc ^.^ (so genau erklären kann ich es mir auch nicht, aber solange es nun mit trim funktioniert :-D)

Ich finde das mit DBParams in meinem Fall nicht schlimm, dies ist ja "nur" der Benutzer der Rechte hat um auf der DB SQL-Abfragen zu machen.
Der Nutzer der sich über mein Loginskript letztendlich einloggt steht ja in der Tabelle selbst und wird durch
Code: Select all
AuthDBDUserPWQuery \
      "SELECT TRIM(pwd) FROM tabelle WHERE user = %s"

entsprechend geprüft.
Oder verstehe ich dich hier falsch und du meinst etwas anderes?
Meine Umgebung:
- Apache 2.4.3
- PHP 5.4.9
- Windows Server 2008 R2

Manuelle Installation ohne XAMPP oder ähnliches.
casi91
 
Posts: 8
Joined: 03. December 2012 09:08
Operating System: Windows Server 2008 R2

Re: Apache 2.4.3 Login über Datenbank

Postby casi91 » 04. December 2012 11:58

So,
soweit so gut. Mein Login funktioniert so, wie ich mir das vorgestellt habe.
Jedoch kommt jetzt das Thema "Logout".
Ich habe hierzu bisher noch nichts hilfreiches gefunden, außer

http://httpd.apache.org/docs/current/mod/mod_authz_dbd.html

Code: Select all
  <Files login.html>
    # don't require user to already be logged in!
    AuthDBDUserPWQuery "SELECT password FROM authn WHERE user = %s"

    # dbd-login action executes a statement to log user in
    Require dbd-login
    AuthzDBDQuery "UPDATE authn SET login = 'true' WHERE user = %s"

    # return user to referring page (if any) after
    # successful login
    AuthzDBDLoginToReferer On
  </Files>

  <Files logout.html>
    # dbd-logout action executes a statement to log user out
    Require dbd-logout
    AuthzDBDQuery "UPDATE authn SET login = 'false' WHERE user = %s"
  </Files>


Jedoch möchte ich eigentlich nicht noch ein Kennzeichen in der DB haben, das anzeigt, ob der Benutzer eingeloggt ist oder nicht.
Es muss doch auch eine Möglichkeit geben, beim logout zu sagen, dass die entsprechenden Cookies gelöscht werden sollen.
Oder ist das etwa unmöglich?
Meine Umgebung:
- Apache 2.4.3
- PHP 5.4.9
- Windows Server 2008 R2

Manuelle Installation ohne XAMPP oder ähnliches.
casi91
 
Posts: 8
Joined: 03. December 2012 09:08
Operating System: Windows Server 2008 R2

Re: Apache 2.4.3 Login über Datenbank

Postby casi91 » 05. December 2012 13:42

Habe das Logout-Problem nun doch wie in meinem letzten Beitrag geschrieben gelöst.
Es gibt nun ein entsprechendes Kennzeichen in der Datenbank, welches zusätzlich zu dem Sessioncookie prüft ob der nutzer noch aktiv ist.
Sollte der Nutzer sich ausloggen, wird es auf false gesetzt und hat somit keinen gültigen Login mehr, schließt er einfach nur den Browser, ist der Session-Cookie weg und somit besitzt er ebenfalls keinen gültigen Login mehr.


Von der Funktion an sich bin ich nun zufrieden, allerdings sehe ich, wenn ich mich einlogge und mir die Cookies anschaue, den Benutzernamen und mein Passwort im klartext. Das gefällt mir nicht wirklich. Was kann ich hier tun, um diesen Eintrag zu verschlüsseln?
Habe es schon mit
Code: Select all
SessionCryptoPassphrase secre
versucht, allerdings kommt dann nach dem Login die Meldung, dass der Server angeblich zurückgesetzt wurde.

Der String im Cookie hat ungefährt diese Form:
MyServer-user=testusr&MyServer-pw=mypwd


Irgendwelche Vorschläge?
Meine Umgebung:
- Apache 2.4.3
- PHP 5.4.9
- Windows Server 2008 R2

Manuelle Installation ohne XAMPP oder ähnliches.
casi91
 
Posts: 8
Joined: 03. December 2012 09:08
Operating System: Windows Server 2008 R2


Return to Apache

Who is online

Users browsing this forum: No registered users and 3 guests