2012-06-17 13 views
6

apache2 से आ रहा है केवल एक विशेषता है जिसे मैं संग्रहित नहीं कर सकता: उपयोगकर्ताओं को पासवर्ड-डेटाबेस (htpasswd) में और विभिन्न फ़ाइलों/फ़ोल्डरों/वर्चुअल सर्वर तक पहुंच की अनुमति दें।nginx समूह http auth

बेसिक http प्रमाणन मैं काम करता है सक्षम:

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; 
} 

अगर मैं user1, user2 file_a में और user2, user3 file_b में है, यह काम करता है, लेकिन मैं दोनों फ़ाइलों को अपडेट करना पड़ता है जब मैं उपयोगकर्ता 2 के लिए पासवर्ड बदलता हूं (पासवर्ड सभी स्थानों के लिए समान होना चाहिए)। चूंकि मेरे पास अलग-अलग एक्सेस अधिकारों और> 10 उपयोगकर्ताओं के साथ 15 अलग-अलग स्थान होंगे, इसलिए इसे संभालना वास्तव में आसान नहीं है। (मुझे बढ़िया अनाज के अधिकार अधिकार पसंद हैं!)

अपाचे के साथ मैंने प्रत्येक स्थान के लिए अलग-अलग समूहों को परिभाषित किया और सही समूह की आवश्यकता थी। उपयोगकर्ताओं को समूहों में जोड़ने/हटाने के रूप में पहुंच को बदलना उतना ही आसान था।

क्या ऐसा कुछ है या इस परिदृश्य को आसानी से nginx के साथ कैसे संभाला जा सकता है?

उत्तर

0

मैं अंत में बुनियादी http प्रमाणन के साथ इस तरह यह प्रबंधन:

  • प्रत्येक समूह के लिए मेरे पास एक अलग पासवर्ड फ़ाइल है, उदाहरण के लिए group_a.auth, group_b.auth, ...
  • इसके अलावा, मैं जहां प्रत्येक उपयोगकर्ता और पासवर्ड लिखा है एक फ़ाइल, जैसे passwords.txt
  • passwords.txt तरह user1:password_hash
  • प्रमाणन फ़ाइलों की तरह एक ही प्रारूप है, तो कुछ न कुछ है मैं एक गहरे लाल रंग का स्क्रिप्ट update.rb से उपयोगकर्ता की पासवर्ड सिंक करने के लिए है है password.txt सभी .auth करने के लिए फ़ाइलों (अच्छी तरह से अधिक एक sed के आवरण):

रूबी स्क्रिप्ट update.rb:

में अद्यतन पासवर्ड और update.rb
  • (group_a को जैसे new_user) एक समूह को एक उपयोगकर्ता जोड़ने के लिए निष्पादित करें::
    • किसी उपयोगकर्ता का पासवर्ड को अद्यतन करने के लिए खुला group_a.auth और लाइन new_user: जोड़ें।तब passwords.txt करने के लिए new_user:password_hash जोड़ने ही उपयोगकर्ता पहले से मौजूद नहीं है और अंत में update.rb
  • 11

    आप AuthDigest मॉड्यूल और क्षेत्रों के रूप में क्षेत्रों का उपयोग करके यह काम कर सकते हैं - आपके पास एक उपयोगकर्ता के लिए एकाधिक प्रविष्टियां होंगी, लेकिन आप उन्हें एक फ़ाइल में लाइन के बाद लाइन कर सकते हैं। सही नहीं है, लेकिन अब आपके पास दुःस्वप्न से बेहतर है।

    विन्यास (देखें 2 स्थान के लिए auth_digest और user_file) में छोटे परिवर्तन:

    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; 
    } 
    

    और file_a:

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

    धन्यवाद, अच्छा लग रहा है। अगली बार जब मैं ngnix का उपयोग करता हूं, तो मैं इसका परीक्षण करूंगा ;-) – Markus

    -1

    मैं एक स्क्रिप्ट का उपयोग कर रहा nginx-groups.pl कि अपाचे शैली पासवर्ड और समूहों फ़ाइलों को पार्स करता है और प्रत्येक समूह के लिए अलग-अलग पासवर्ड फ़ाइलें उत्पन्न करता है चलाते हैं। तो यह अनिवार्य रूप से मार्कस के उत्तर में रूबी लिपि जैसा ही काम करता है लेकिन यह सभी समूहों के लिए केवल एक फ़ाइल का उपयोग करता है और समूह फ़ाइल अपाचे के समान प्रारूप में है।

    स्क्रिप्ट के वर्तमान संस्करण है:

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

    यह सहेजें जो भी नाम आप की तरह है और यह निष्पादन योग्य बनाने के तहत। बिना तर्क के इसे आमंत्रित करना एक छोटी उपयोग जानकारी प्रिंट करेगा।

    विवरण के लिए http://www.guido-flohr.net/group-authentication-for-nginx/ देखें!

    +0

    हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/13697810) –

    +0

    ठीक है, @ unamata-sanatarai, मैंने स्क्रिप्ट का स्रोत कोड जोड़ा है। –