Perl CGI :: Session с использованием CGI :: Session :: Driver :: mysql - PullRequest
2 голосов
/ 12 ноября 2011

У меня проблема с хранением сеансов в базе данных MySQL с использованием CGI :: Session.

Вот фрагмент

#!/usr/bin/perl

use CGI;
use CGI::Session;
use CGI::Session::Driver::mysql;
use DBI;
use DBD::mysql;
use Net::LDAPS;

require '../include/include.pl';

$LDAP_SERVER = 'my.test.ldap.example.com';
$LDAP_SSL_PORT = '636';
$LDAP_BASE = 'ou=users,dc=example,dc=com';

$ldap = Net::LDAPS->new($LDAP_SERVER, port=> $LDAP_SSL_PORT)
    or die "Unable to create LDAP object because: $! \n";

$dbh = DBI->connect("DBI:mysql:host=$db_host;database=$db_name",$db_user,$db_pswd)
    or die "Unable to connect to database: \"$DBI::errstr\" $! \n";

$q = CGI->new;

$usr = $q->param('usr') || undef;
$userDN = "uid=$usr,$LDAP_BASE";

if($usr) {
    $pwd = $q->param('pwd');
    $ldapMsg = $ldap->bind($userDN, password=>$pwd);
    $result = $ldap->code;

    if ($result == 0) {
        $session = CGI::Session->new('driver:mysql', undef, 
                     {  TableName=>'car_sessions',
                        IdColName=>'id',
                        DataColName=>'a_session',
                        Handle=>$dbh})
            or die "Unable to create session because: $!";

        $session->expire('+1h');
        $session->param(-name=>'car_login', -value=>$usr);
        $sess_cookie = $q->cookie(-name=>'CGISESSID', -value=>$session->id, -expires=>'+1h', -path=>'/hr_car/');
        $login_cookie = $q->cookie(-name=>'car_login', -value=>$usr, -expires=>'+1h', -path=>'/hr_car/');
        print $q->header(-cookie=>[$sess_cookie, $login_cookie], -location=>'manage.cgi');
    }

LDAP правильно связывается, и куки устанавливаются правильно, но в моей таблице сеансов НИЧЕГО не появляется!

Что я мог делать не так ??

1 Ответ

0 голосов
/ 12 ноября 2011

Мне кажется, проблема в том, что автоматическая промывка ненадежна . Существует явная проблема с ручками DBI, выходящими из области видимости до того, как произойдет автоматическая очистка, поэтому вызовите $session->flush, как только вы закончите настройку сеанса и после его удаления.

Вы можете решить эту проблему, используя лексики с областями файлов вместо глобальных для $dbh и друзей, Perl может очистить их в правильном порядке, и это просто хорошая идея.

PS Включите строгие и предупреждения и объявите все эти переменные. Ваша проблема могла быть так же легко вызвана опечаткой, и вы бы никогда ее не узнали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...