2012-06-17 21 views
6

proveniente da apache2 l'unica funzione che non posso archiviare: avere utenti in un database di password (htpasswd) e consentire l'accesso a diversi file/cartelle/server virtuali.nginx group http auth

http autenticazione di base mi ha permesso opere:

location ~ ^/a/ { 
    # should allow access for user1, user2 
    auth_basic   "Restricted"; 
    auth_basic_user_file /etc/nginx/auth/file_a; 
} 
location ~ ^/b/ { 
    # should allow access for user2, user3 
    auth_basic   "Restricted"; 
    auth_basic_user_file /etc/nginx/auth/file_b; 
} 

se ho user1, utente2 in file_a e user2, user3 in file_b, questo funziona ma devo aggiornare entrambi i file quando cambio la password per user2 (la password deve essere la stessa per tutte le località). Dal momento che avrò> 15 diverse posizioni con diversi diritti di accesso e> 10 utenti, questo non è veramente facile da gestire. (Adoro i diritti di accesso a grana fine!)

Con Apache ho definito diversi gruppi per ogni posizione e richiesto il gruppo giusto. Cambiare accesso era facile come aggiungere/rimuovere utenti ai gruppi.

C'è qualcosa del genere o come può essere gestito facilmente questo scenario con nginx?

risposta

0

finalmente riesco in questo modo con autenticazione base http:

  • Per ogni gruppo ho un file password separato, ad es. group_a.auth, group_b.auth, ...
  • Inoltre, ho un file in cui vengono scritti ogni utente e password, ad esempio passwords.txt
  • passwords.txt ha lo stesso formato come i file auth, in modo da qualcosa come user1:password_hash
  • Ho uno script ruby ​​update.rb per sincronizzare le password degli utenti da password.txt a tutti .auth file (ben più di un involucro a sed):

script Ruby update.rb:

#!/usr/bin/env ruby 

passwords = File.new("./passwords.txt","r") 

while pwline = passwords.gets 
    pwline.strip! 
    next if pwline.empty? 

    user, _ = pwline.split(':') 
    %x(sed -i 's/#{user}:.*/#{pwline.gsub('/','\/')}/g' *.auth) 
end 
  • Per aggiornare la password di un utente: Password aggiornamento in passwords.txt ed eseguire update.rb
  • Per aggiungere un utente a un gruppo (ad esempio, new_user-group_a): aperto group_a.auth e aggiungere la riga new_user:.Quindi aggiungere new_user:password_hash-passwords.txt se l'utente non è già presente e, infine, eseguire update.rb
11

È possibile ottenere questo funzionamento utilizzando AuthDigest modulo e regni come gruppi - avrete più voci per un utente, ma è possibile averli riga dopo riga in un unico file. Non perfetto, ma migliore dell'incubo che hai ora.

piccolo cambiamento nella configurazione (vedi auth_digest e user_file per il 2 ° posizione):

location ~ ^/a/ { 
    # should allow access for user1, user2 
    auth_digest   "Restricted"; 
    auth_digest_user_file /etc/nginx/auth/file_a; 
} 
location ~ ^/b/ { 
    # should allow access for user2, user3 
    auth_digest   "Restricted2"; 
    auth_digest_user_file /etc/nginx/auth/file_a; 
} 

e file_a:

user1:Restricted1:password_hash 
user2:Restricted1:password_hash 
user2:Restricted2:password_hash 
user3:Restricted2:password_hash 
+0

grazie, sembra buono. Lo proverò la prossima volta che uso ngnix ;-) – Markus

-1

Sto usando uno script nginx-groups.pl che analizza i file apache di password e gruppi stile e genera file di password individuali per ogni gruppo. Quindi essenzialmente fa la stessa cosa dello script Ruby nella risposta di Markus ma usa solo un singolo file per tutti i gruppi e il file di gruppo è nello stesso formato di apache.

L'attuale versione dello script è:

#! /usr/bin/env perl 

use strict; 

die "Usage: $0 USERSFILE GROUPSFILE\n" unless @ARGV == 2; 
my ($users_file, $groups_file) = @ARGV; 

my %users; 
open my $fh, "<$users_file" or die "cannot open '$users_file': $!\n"; 
while (my $line = <$fh>) { 
    chomp $line; 
    my ($name, $password) = split /:/, $line, 2; 
    next if !defined $password; 
    $users{$name} = $line; 
} 

open my $fh, "<$groups_file" or die "cannot open '$groups_file': $!\n"; 
while (my $line = <$fh>) { 
    my ($name, $members) = split /:/, $line, 2 or next; 
    next if !defined $members; 
    $name =~ s/[ \t]//g; 
    next if $name eq ''; 
    my @members = grep { length $_ && exists $users{$_} } 
        split /[ \t\r\n]+/, $members; 

    my $groups_users_file = $name . '.users'; 

    print "Writing users file '$groups_users_file'.\n"; 

    open my $wh, ">$groups_users_file" 
     or die "Cannot open '$groups_users_file' for writing: $!\n"; 

    foreach my $user (@members) { 
     print $wh "$users{$user}\n" 
      or die "Cannot write to '$groups_users_file': $!\n"; 
    } 

    close $wh or die "Cannot close '$groups_users_file': $!\n"; 
} 

Salva sotto qualsiasi nome che ti piace e renderlo eseguibile. Invocandolo senza argomenti verrà stampata una breve informazione di utilizzo.

Vedere http://www.guido-flohr.net/group-authentication-for-nginx/ per dettagli!

+0

Sebbene questo link possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/13697810) –

+0

Ok, @ unamata-sanatarai, ho aggiunto il codice sorgente dello script. –

Problemi correlati