Redirect dopo il login con Django

voti
1

Ho una serie di login-page come pagina iniziale, localhost / mysite. Posso fare il login e con successo essere reindirizzati al localhost / mysite / mainpage.

Il problema è che posso bypassare il login semplicemente semplicemente inserendo il percorso nella URL, ad esempio; Naviga verso la home page dove il login-forma è, poi ho aggiungo / mainpage al localhost / mysite / che con successo carichi localhost / mysite / mainpage.

Come si può immaginare, questo non è grande. Qualcuno sa che cosa ho fatto di sbagliato qui?

La mia opinione

def index(request):
    if request.method == POST:
        form = AuthenticationForm(request, data=request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            user = authenticate(username=username, password=password)
            if user is not None:
                login(request, user)
                messages.info(request, OK)
                return redirect('/mysite/mainpage')
            else:
                messages.error(request, NOT OK)

    form = AuthenticationForm()
    return render(request, 'mysite/login.html', {form:form})

Il mio urls.py

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^mainpage/$', views.main),
]
È pubblicato 13/02/2020 alle 22:03
fonte dall'utente
In altre lingue...                            


1 risposte

voti
1

È possibile utilizzare il @login_requireddecoratore [Django-doc] sul vostro mainpunto di vista. Ciò reindirizzerà al set percorso dalla LOGIN_URLimpostazione [Django-doc] il login l'utente:

# app/views.py

from django.contrib.auth.decorators import login_required

def index(request):
    # …

@login_required
def main(request):
    # …

e nel settings.py:

# settings.py

# …
LOGIN_URL = 'index'
# …

EDIT : È possibile omettere il ?next=parametro di query, impostando il redirect_field_name=…parametro su None:

@login_required(redirect_field_name=None)
def main(request):
    # …
Risposto il 13/02/2020 a 22:08
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more