Використовується СУБД Postgres.
У мене паролі в базі зараз зберігаються у нешифрованому вигляді.
my_auth.pl (Basic- авторизація):
#!/usr/bin/perl
use Pg;
my ($uname, $passwd);
my @row;
my $base = 'база_даних';
my $dbuser = 'логін_до_бази';
my $dbuserpwd = 'пароль_до_бази';
my $conn = Pg::setdbLogin('','','','',$base,$dbuser,$dbuserpwd);
$|=1;
while ($s = <>){
#Отримали від Squid логін і пароль (логін не може містити пробілів, бо логін і пароль розділяються пробілом при передачі від Squid до програми авторизації, пароль може містити пробіли)
$i = index($s,' ');
$uname = substr ($s,0,$i);
chomp($passwd = substr ($s,$i+1));
$query="select cpwd from users where login='$uname'";
$result=$conn->exec($query);
@row=$result->fetchrow;
if ($passwd eq $row[0]) {
print "OK\n";
}else
{print "ERR\n";
};
};
my_auth_digest.pl :
#!/usr/bin/perl
use Pg;
use Digest::MD5;
my ($uname, $passwd);
my @row;
my $base = 'база_даних';
my $dbuser = 'логін_до_бази';
my $dbuserpwd = 'пароль_до_бази';
my $conn = Pg::setdbLogin('','','','',$base,$dbuser,$dbuserpwd);
$|=1;
while ($s = <>){
#Отримуємо від Squid username і realm
chomp $s;
my ($uname,$realm) = split /:/, $s;
chop $uname; chop $realm;
$uname=substr($uname,1);$realm=substr($realm,1);
$query="select cpwd from users where login='$uname'";
$result=$conn->exec($query);
@row=$result->fetchrow;
if ($row[0]) {
$hha1 = Digest::MD5::md5_hex (join ':',$uname,$realm,$row[0]);
print "$hha1\n";
}else{print "ERR\n" };
};
Це, правда, трохи скорочені скрипти, я повикидав всякі додаткові перевірки (по групах користувачів, лімітах etc.), щоб було зрозуміло, як воно працює.
P.S. Логін і пароль не повинні містити символ ":", логін не повинен містити пробілів.