Domanda

Sto per pubblicare una versione beta del sito su cui sto lavorando sul Web. Deve disporre di un codice beta per limitare l'accesso. Il sito è scritto in django.

Non voglio cambiare il sistema Auth fondamentale per adattarsi a un codice beta, e non mi interessa in particolare che la sicurezza del codice beta sia rivestita di ferro, solo che è un ostacolo significativo.

Come dovrei farlo? È un progetto abbastanza grande, quindi aggiungere codice ad ogni vista è tutt'altro che ideale.


Quella soluzione funziona bene. La classe Middleware Ho finito con questo:

from django.http import HttpResponseRedirect

class BetaMiddleware(object):
    """
    Require beta code session key in order to view any page.
    """
    def process_request(self, request):
        if request.path != '/beta/' and not request.session.get('in_beta'):
            return HttpResponseRedirect('%s?next=%s' % ('/beta/', request.path))
È stato utile?

Soluzione

Inizia con questo snippet di Django , ma modificalo per controllare request.session [ 'has_beta_access'] . Se non ce l'hanno, fai in modo che restituisca un reindirizzamento a un " inserisci il codice beta " pagina che, quando pubblicato con il codice giusto, imposta la variabile di sessione su True .

Renderlo una beta pubblica consiste semplicemente nella rimozione di quel middleware dall'impostazione MIDDLEWARE_CLASSES .

Altri suggerimenti

Probabilmente puoi limitare l'accesso all'intero sito tramite apache con htaccess, eliminando completamente il problema dallo spazio del progetto del django.

Fai ciò che StackOverflow ha fatto.

Avevano un semplice modulo email / password. Aveva una sola password hardcoded (falkensmaze). Quando l'utente ottiene la password corretta imposta un cookie. per esempio. auth = 1

Non preoccuparti che non sia sicuro. A chi importa se qualcuno entra nella beta?

Apache / htaccess è anche una soluzione piacevole e semplice.

Dovresti essere in grado di aggiungere decoratori @login_required su tutta la linea ed essere fatto con esso. A meno che tu non abbia un carico di funzioni di visualizzazione, non dovrebbe essere troppo orribile.

Non sono sicuro di quale versione del codice Pinax stai usando, ma hanno incorporato la possibilità di chiudere il sito per una beta privata, quindi non devi fare molto lavoro da solo.

Il link al modello di progetto specifico per un sito beta privato è qui: http://github.com/pinax/pinax/tree/3ad73d1ba44f37365333bae17b507668b0eb7e16/pinax/projects/private_beta_project anche se penso che potrebbero aver aggiunto questa funzionalità a tutti i modelli di progetto.

Grande frammento ma mi ha causato molti problemi relativi alle sessioni OpenId. Quindi finisco per fare affidamento sui cookie anziché sulla sessione:

class BetaMiddleware(object):
    """
    Require beta code cookie key in order to view any page.
    """
    set_beta = False
    def process_request(self, request):
        referer = request.META.get('HTTP_REFERER', '')

        if request.method == 'GET' and not 'is_in_beta' in request.COOKIES:
            return HttpResponseRedirect('%s?next=%s' % ('/beta/', request.path))

        if request.method == 'POST' and 'pass' in request.POST:
            code = request.POST['pass']

            if code=='beta':
                self.set_beta = True
                return HttpResponseRedirect('%s' % '/')

    def process_response(self, request, response):        

        if self.set_beta is True:
            response.set_cookie('is_in_beta', '1')
        return response

Non è sicuro ma per me è abbastanza. Funziona anche con solo una pagina beta html.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top