gpt4 book ai didi

perl - 为什么在我使用 CGI::Session::Auth::DBI 时 $auth->loggedIn 永远不会为真?

转载 作者:行者123 更新时间:2023-12-04 12:25:41 25 4
gpt4 key购买 nike

使用 CGI::Session::Auth::DBI 中的示例和 CGI::Session::Auth页,我试图实现 _login功能没有成功。我正在使用 Windows 7 和 Apache 2。

#!/usr/bin/perl -w
use strict;

use CGI::Carp qw(fatalsToBrowser);

use CGI;
use CGI::Session;
use CGI::Session::Auth::DBI;

my $cgi = new CGI;

# using '.' directory for testing
my $session = new CGI::Session(undef, $cgi, {Directory=>'.'});
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' # auth_user already in use
});

print "Content-type: text/html\n\n";

if ($auth->_login("admin", "admin")) {
print "<p>login ok</p>";
} else {
print "<p>login fail</p>";
}

if ($auth->loggedIn) {
print "<p>logged in; go to <a href='index.pl'>index</a></p>";
} else {
print "<p>not logged in</p>";
}
渲染的输出是:
login ok
not logged in
如果我更改传递给 _login 的值到“foo”、“bar”(无效的用户名/密码),然后我得到这个渲染结果:
login fail
not logged in
我正在使用 '。'只是为了测试,因为我知道这是我可以写的目录。每次我运行代码时, cgisess_文件已创建(例如 cgisess_9fb493cc9155ee9dd2b18fddc38139d8 ),但无论我是否使用正确的用户名,都会创建此文件。没有返回错误,但是 $auth->loggedIn总是假的。
文档说 _login是虚拟的,听起来 DBI 模块会覆盖它,但我不确定。
我可能做错了什么?
更新1:
我也试过使用 $auth->authenticate()在调用 $auth->loggedIn 之前但这没有效果。我也试过使用 $auth->authenticate()$auth->loggedIn成功登录后在另一个上,但我得到相同的结果。不管我做什么, $auth->loggedI总是假的。
更新 2:
我还尝试将目录更改为“/”,它所做的只是创建 cgisess / 中的文件而不是当前目录。
更新 3:
我认为这可能是数据库记录的问题;我正在使用示例页面中的默认示例,但修改了管理员密码。这是一个 phpMyAdmin 导出:
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');
再说一次,如果 _login正在返回 true使用有效的用户名和密码,那么我会假设用户 ID 是有效的......不是吗?
更新 4:
我还在我们的 Linux 生产服务器上对此进行了测试,并且遇到了完全相同的问题。

最佳答案

尝试输出 $session->header() 的结果作为你输出的第一件事。这应该设置您的 cookie 并加载现有 session ,而不是每次都创建一个新 session 。

另外,_login()只对数据库进行认证,不修改$auth目的。使用 authenticate() ,您需要使用 param() 定义用户名和密码您的$cgi 的功能目的。您需要设置字段log_usernamelog_password对于authenticate()发挥作用。

#!/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>";
}

我还没有测试过,但这应该可以工作。

关于perl - 为什么在我使用 CGI::Session::Auth::DBI 时 $auth->loggedIn 永远不会为真?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2039163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com