Utilisation des exemples du CGI :: Session :: Auth :: DBI et CGI :: Session :: Auth pages, j'ai tenté de mettre en œuvre la fonction _login code> sans succès. J'utilise Windows 7 et Apache 2.
CREATE TABLE IF NOT EXISTS `cgi_auth_user` (
`userid` char(32) collate utf8_unicode_ci NOT NULL,
`username` varchar(30) collate utf8_unicode_ci NOT NULL,
`passwd` varchar(30) collate utf8_unicode_ci NOT NULL default '',
PRIMARY KEY (`userid`),
UNIQUE KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `cgi_auth_user` (`userid`, `username`, `passwd`) VALUES
('325684ec1b028eaf562dd484c5607a65', 'admin', 'admin'),
('ef19a80d627b5c48728d388c11900f3f', 'guest', 'guest');
4 Réponses :
Le DOC est assez clair que vous devez remplacer la méthode _Login (), à moins que l'invité / invité ne fonctionne pour vous. De plus, vous n'appelez pas authentifié (), qui invoque réellement _Login (), vous ne devriez pas le faire. p>
_Login () p>
Cette méthode virtuelle effectue la tentative de connexion réelle en comparant le Données de formulaire de connexion Le visiteur envoyé avec une base de données d'utilisateurs locale. Le _login Méthode de la classe de base Cgi :: session :: authentifie seulement connaît l'utilisateur "Guest" avec mot de passe 'Guest'. P>
Pour accéder à une bonne base de données d'utilisateurs, vous avoir à utiliser une sous-classe qui modifie la méthode _login de manière appropriée. Voir les modules dans l'auth / sous-répertoire. P> blockQuote>
Le "voir les modules dans l'auth / sous-répertoire". une partie est un peu trompeuse, je pense; Depuis CGI :: Session :: Auth :: DBI Code> est dans l'auth / sous-répertoire (n'est-ce pas?) Donc, cela me conduit à supposer que ce module remplace
_login code>. ..
Au fait, _login code> renvoie true lorsque j'utilise un nom d'utilisateur et un mot de passe valides, et false lorsque j'utilise de fausses informations d'identification. Je crois donc que je l'utilise correctement. Je vais mettre à jour ma réponse.
Ouais après l'avoir regardé un peu je vois _Login () est remplacé par DBI. authentifier () semble utiliser "log_password", "log_username" par défaut cependant.
En regardant le code source et la documentation, LOGINVARPREFIX: Par défaut, CGI :: Session :: Auth. Pour éviter les conflits, le préfixe 'log_' peut être modifié par ce paramètre. P>
blockQuote> Je crois que cela fonctionnera p> _login () code> ne définit jamais le drapeau "code> autocollant interne code>. Cela n'est effectué que dans le module authentifié. Vous devriez également vous rappeler qu'il est généralement accepté Perl pratique que les méthodes commençant par «_» doivent être traitées essentiellement comme des méthodes privées (ou en terminologie Java peut-être protégée) uniquement pour être utilisées par des sous-classes. Donc, vous ne devriez pas utiliser directement _login.
Merci, je vais donner cela un coup de feu demain.
HMM retourne toujours "non connecté" - j'ai copié et collé votre code.
Aha! Presque, jetez un coup d'œil à la réponse de Wolf. Le code regarde les paramètres params $ CGI et non $ de paramètres de session.
Vous pouvez activer la journalisation en plaçant ceci au-dessus de la My $ CGI = nouveau CGI; Ligne Cela allumera le débogage et vous permettra de voir plus de ce qui se passe. p> p>
Merci, ce sera utile que je pense.
J'ai dû installer journal :: log4perl - la page chargee OK, mais comment puis-je voir la sortie de débogage?
Essayez de sortir les résultats de aussi, $ session-> en-tête () code> comme première chose que vous produisez. Cela devrait définir votre cookie et charger la session existante au lieu de créer une nouvelle à chaque fois.
_login () code> effectue uniquement l'authentification avec la base de données, mais ne modifie pas le
$ auth- code> objet. Utilisation de
authentifier () code>, vous devez définir le nom d'utilisateur et le mot de passe à l'aide de la fonction
param () code> de votre
$ cgi code> objet. Vous devez définir les champs
log_username code> et
log_password code> pour le
authentifier () code> fonction pour fonctionner. P>
#!/usr/bin/perl -w
use strict;
use CGI::Carp qw(fatalsToBrowser);
use CGI;
use CGI::Session;
use CGI::Session::Auth::DBI;
my $cgi = CGI->new;
my $session = new CGI::Session(undef, $cgi, {Directory=>'/tmp'});
my $auth = new CGI::Session::Auth::DBI({
CGI => $cgi,
Session => $session,
DSN => 'dbi:mysql:dbname=foobar:host=localhost',
DBUser => 'foo',
DBPasswd => 'bar',
UserTable => 'cgi_auth_user'
});
print $session->header();
$cgi->param('log_username', 'admin');
$cgi->param('log_password', 'admin');
$auth->authenticate();
if ($auth->loggedIn) {
print "<p>logged in; go to <a href='index.pl'>index</a></p>";
} else {
print "<p>not logged in</p>";
}
Parfait; Je me demande si c'est une façon de le faire? Le code exemple ne mentionne pas que nous devons définir $ cgi-> param code> - je suppose que cela utiliserait des valeurs postales, mais j'ai essayé cela et pas de chance. Quoi qu'il en soit, votre réponse fonctionne, alors merci!
Ah! En fait, je viens de réappayer avec poteau et il s'avère que vous devez utiliser log_ avant les noms de champs: Imprimer '
Je crois que vous pourriez également utiliser GET, mais cela ne serait pas trop sécurisé. ;)
Évitez d'utiliser la notation d'objet indirect (c'est-à-dire
nouveau CGI code>). Utilisez la syntaxe d'invocation de la méthode (I.e.
cgi-> nouveau code>). Voir perdoc.perl.org/perlobj.html#indirect-Object-syntax A> et perlbuzz.com/mechanix/2008 / 02 / ...
Je viens de regarder un code, et le module :: DBI fait i> remplacer _Login. Quant à la raison pour laquelle votre code ne fonctionne pas: la base de données est-elle mise en place? Avez-vous regardé dans le journal des erreurs? Pouvez-vous activer le débogage?
Oui, le dB est mis en place et travaillant; Pour prouver cela, j'ai changé en un nom d'utilisateur de faux dB et obtenu une erreur de DB. Dois-je activer les informations de débogage à l'aide d'un commutateur code> perl code>? J'ai regardé
- aide code> mais je ne comprends pas la partie de débogage; Cela devrait peut-être être une nouvelle question?
$ auth-> log = 1 (de la source de la source)
Vous pouvez essayer de le gérer avec le débogueur Perl - je trouve personnellement cela un peu déroutant. Je suppose que si vous pouvez exécuter le script CGI à partir de la ligne de commande, il s'agit d'une option viable. Les modules d'authentification ont des déclarations de débogage intégrées cependant - regardez dans la source. Comme l'indique Ergosys, il y a un drapeau de journal (à
Nouveau code>). Je pense que vous devrez peut-être aussi fournir un objet Log4Perl initialisé ... Désolé, pas un expert sur ces modules (ne les utilisez jamais) d'essayer d'aider ;-)
@FalsevinyLshrub J'ai essayé Journal :: log4perl mais je ne sais pas comment voir la sortie.
Message d'erreur @ Agosys est: Impossible de localiser la méthode d'objet "Log" via Package "CGI :: Session :: Auth :: DBI"