PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Benutzerauthentifizierung



ThorstenHirsch
22-12-2005, 16:52
Servus!

Kann ich in php Benutzer (z.B. mittels PAM) authentifizieren? Ich würde das nur sehr ungerne mit mod_auth_pam von Apache machen lassen, sondern lieber auf meiner Website user/password in einem Formular abfragen. Es muss auch nicht unbedingt PAM sein, ich muss nur irgendwie das Eingegebene über die /etc/passwd und shadow überprüfen. Da dies aber sowieso irgendwann auf ldap umgestellt wird, wollte ich beides abdecken...und das ist mit PAM ja wohl möglich, oder?

Gruß
Thorsten

michael.sprick
22-12-2005, 17:21
Hi,

schau mal hier: http://www.math.ohio-state.edu/~ccunning/pam_auth/

laut Doku soll eine Authentifizierung dann ziemlich easy sein:




<?
if (pam_auth($username, $password, &$error)) {
echo "Yeah baby, we're authenticated!";
} else {
echo $error;
}
?>

ThorstenHirsch
22-12-2005, 18:41
Das ist ja einfach. :)

Danke, Michael, werd' ich gleich morgen probieren.

ThorstenHirsch
23-12-2005, 11:02
Schade, klappt leider nicht. Ich bekomm' diesen Fehler im Apache-errorlog:

PHP Warning: Unknown(): pam_auth: Unable to initialize module\nModule compiled with module API=20020429, debug=0, thread-safety=0\nPHP compiled with module API=20020429, debug=0, thread-safety=1\nThese options need to match\n in Unknown on line 0
Hab's mit Installationsmethode 2 (mit phpize) versucht.
Naja, vielleicht ist's nicht mit PHP4.4 kompatibel? Die neueste Version heißt ja leider "pam_auth 0.4 for php 4.3". :(

undefined
23-12-2005, 11:08
pam_auth Ist ein Apache Modul ;)

ClausVB
23-12-2005, 16:04
Ich benutze immer die mod_auth (http://doku.clausvb.de/doku_modauth.htm) (ohne PAM) und kann nichts Nachteiliges sagen.

Gruß
Claus

ThorstenHirsch
23-12-2005, 16:12
@undefined: Ja, auch, aber dieses pam_auth ist ein PHP-Modul. Bin mir ziemlich sicher, dass ich mich da nicht vertan hab', aber ich werd's nochmal prüfen...nach Weihnachten.

@ClausVB: Danke, das werde ich mir mal als Alternative anschauen.

undefined
23-12-2005, 17:27
PHP ist eine Client Anwendung von Apache wenn es als Modules Kompiliert wurde, wenn dir also Apache dies nicht zu Verfügung stellt kann dies auch nicht gehen. Das gleiche gilt für mod_auth was wiederum vom Diretcory Flag abhängt.


<Directory "/srv/www/htdocs/mein/Pfad">
Options All
AllowOverride Indexes FileInfo Authconfig
Order allow,deny Allow from all
</Directory>

ThorstenHirsch
27-12-2005, 10:56
Okay, also ich habe jetzt auch das AUTH_PAM-Modul vom Apache installiert und "-D AUTH_PAM" zu den APACHE2_OPTS hinzugefügt um es zu aktivieren. Es funktioniert aber trotzdem nicht, ich bekomme noch den gleichen Fehler.

ThorstenHirsch
27-12-2005, 13:32
Also eigentlich ist die Fehlermeldung ja ziemlich eindeutig: PHP wurde mit thread-safety=1 kompiliert, das Modul hingegen mit thread-safety=0. Da dies nicht übereinstimmt, kann das Modul nicht initialisiert werden.

Jetzt hab' ich aber ein Problem damit, das Modul so zu kompilieren, dass thread-safety=1 ist. Es gibt in der configure kein Parameter für so etwas, auch nicht -pthreads oder irgendwas mit ZTS. Wie ich auf ZTS komme? Nun, ich glaube, dass diese Stelle in der php_pam_auth.h dafür verantwortlich ist:

#ifdef __ZTS
#include "TSRM.h"
#endif

PHP_MINIT_FUNCTION(pam_auth);
PHP_MSHUTDOWN_FUNCTION(pam_auth);
PHP_MINFO_FUNCTION(pam_auth);

PHP_FUNCTION(pam_auth);

ZEND_BEGIN_MODULE_GLOBALS(pam_auth)
char *servicename;
ZEND_END_MODULE_GLOBALS(pam_auth)

#ifdef ZTS
#define PA_G(v) (pam_auth_globals->v)
#define PA_LS_FETCH() zend_pam_auth_globals *pam_auth_globals = ts_resource(pam_auth_globals_id)
#else
#define PA_G(v) (pam_auth_globals.v)
#define PA_LS_FETCH()
#endif
Also hab' ich einfach mal folgendes über diesem Code eingefügt:

#define ZTS
#define __ZTS
mit folgendem Ergebnis bei "make":

$ make
/bin/sh /home/xn09789/tmp/pam_auth/libtool --mode=compile gcc -I. -I/home/xn09789/tmp/pam_auth -DPHP_ATOM_INC -I/home/xn09789/tmp/pam_auth/include -I/home/xn09789/tmp/pam_auth/main -I/home/xn09789/tmp/pam_auth -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -DHAVE_CONFIG_H -g -O2 -c /home/xn09789/tmp/pam_auth/pam_auth.c -o pam_auth.lo
gcc -I. -I/home/xn09789/tmp/pam_auth -DPHP_ATOM_INC -I/home/xn09789/tmp/pam_auth/include -I/home/xn09789/tmp/pam_auth/main -I/home/xn09789/tmp/pam_auth -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -DHAVE_CONFIG_H -g -O2 -c /home/xn09789/tmp/pam_auth/pam_auth.c -fPIC -DPIC -o pam_auth.lo
/home/xn09789/tmp/pam_auth/pam_auth.c: In function `zif_pam_auth':
/home/xn09789/tmp/pam_auth/pam_auth.c:188: error: `pam_auth_globals_id' undeclared (first use in this function)
/home/xn09789/tmp/pam_auth/pam_auth.c:188: error: (Each undeclared identifier is reported only once
/home/xn09789/tmp/pam_auth/pam_auth.c:188: error: for each function it appears in.)
/home/xn09789/tmp/pam_auth/pam_auth.c:188: warning: initialization makes pointer from integer without a cast
make: *** [pam_auth.lo] Error 1
Ich hab's auch schon damit versucht, nur __ZTS zu definieren - da kommte beim Laden des Moduls der gleiche Fehler - und auch mal nur ZTS zu definieren - da kommt schon der eben aufgeführte Fehler bei make. Es scheint also, dass nur ZTS dafür verantwortlich ist, ob make einen Fehler bringt oder nicht.

Naja, jedenfalls weiß ich jetzt nicht mehr weiter.

undefined
27-12-2005, 20:54
Du hast ein Linker Problem, sind alle openssl und pam Pakete Installiert ?

ThorstenHirsch
28-12-2005, 10:04
Nun ja, ich denke, die benötigten Pakete sind installiert:

- openssl 0.97i
- pam 0.78
- pam-login (nötig? ist jedenfalls auch da)

Wenn was fehlt, hätte dann nicht ein "file not found" beim include kommen müssen?
Hmm....vielleicht ist meine openssl-Version ja zu neu, also das pam_auth.c im thread-safe-Modus nicht mehr kompatibel damit.

ThorstenHirsch
28-12-2005, 11:11
Also ich hab' nix mit "pam_auth_globals_id" finden können - ich glaube einfach, dass der Autor das nie mit aktiviertem thread-safety getestet hat, bzw. auch gar nicht vorgesehen hat. Nun ja, muss ich mich wohl selbst mal darum kümmern, ich schau' mal wie das bei anderen Modulen gelöst ist und wann php überhaupt meint, dass ein Modul mit thread-safety kompiliert wurde und wann nicht...

[...1 Stunde später...]

Oh Mann, ich hab' gerade mal nachgeschaut ob thread-safety überhaupt bei dem PHP-Paket aktiviert ist, das ich auf den Maschinen installiert habe, auf denen pam_auth später zum Einsatz kommen soll: ist es nicht. Arrrrrgh, und ich stocher' schon ne Stunde im Quellcode von php und pam_auth rum um das mit aktiviertem thread-safety zum laufen zu bringen, alles für die Katz'!

...naja, schöner wär's natürlich trotzdem, wenn es sowohl mit als auch ohne zu kompilieren ginge. Da hab' ich zumindest jetzt mal ein Ziel, um ein bisschen gescheiter in die C-Programmierung einzusteigen. ;)