Skip to content

Instantly share code, notes, and snippets.

@solanoize
Last active July 29, 2016 03:50
Show Gist options
  • Select an option

  • Save solanoize/c39798a6cd2ed94495cf0f821f5c3bc5 to your computer and use it in GitHub Desktop.

Select an option

Save solanoize/c39798a6cd2ed94495cf0f821f5c3bc5 to your computer and use it in GitHub Desktop.
Cara mencegah akses ke halaman login setelah login sukses di Django (Django Auth Views Built-in) ?

Problem

waktu itu saat membuat aplikasi yang memerlukan fitur authentication. saya menggunakan built-in login dan logout view dari Django. untuk logout tidak ada masalah namun untuk login saya menghadapi masalah. masalahnya adalah ketika saya login dan berhasil masuk ke halaman dashboard, tanpa logout, saya bisa masuk kembali ke halaman login. nah gimana caranya untuk mencegah akses ke halaman login setelah saya berhasil login ? katanya ada yang bilang gunakan pengecekan is_authenticated dari object request di view. its ok, itu tidak masalah. yang jadi masalah adalah di sini saya tidak membuild view untuk login. kan saya katakan di awal saya menggunakan view auth milik Django (built-in). lalu bagaimana solusinya ? sebelum saya mau ngasih solusinya, saya mau berterimakasih kedapa:

  • blindOSX yang punya masalah yang sama dengan saya.
  • Josh Scholl yang ngedit jawaban agar mudah dimengerti.
  • arie yang ngasih jawaban pasti tentang masalah ini.
  • Motanelu dari user Django Snipet yang telah memberikan decorator untuk masalah ini.
  • Mark Lavin yang ngasih tau caranya gimana menggunakan decorator di dalam urlpatterns.
  • Antonio Mele yang udah ngajarin cara bikin decorator sesuai aturan.

Sumber aslinya ada di : How to prevent the access to login page after successful login in Django?

Untuk Decoratornya ada di : Anonymous required decorator

Solution

pertama buat direktori bernama common sejajar dengan direktori proyek kamu (di dalam direktori root proyek dan app kamu). di sini nama direktori proyek saya adalah bookmarks. setelah itu buat dua file bernama __init__.py dan decorators.py. berikut ini adalah bentuk struktur direktori dan file seluruhnya:

bookmarks (project root)/
    app/
        urls.py
        ...
    bookmarks/
        settings.py
        ....
    common/
        __init__.py
        decorators.py

trus pada bagian decorators.py isikan kode berikut ini:

from django.conf import settings
from django.http import HttpResponseRedirect

def anonymous_required( view_function, redirect_to = None ):
    return AnonymousRequired( view_function, redirect_to )

class AnonymousRequired( object ):
    def __init__( self, view_function, redirect_to ):
        if redirect_to is None:
            redirect_to = settings.LOGIN_REDIRECT_URL
        self.view_function = view_function
        self.redirect_to = redirect_to

    def __call__( self, request, *args, **kwargs ):
        if request.user is not None and request.user.is_authenticated():
            return HttpResponseRedirect( self.redirect_to ) 
        return self.view_function( request, *args, **kwargs )

Setelah itu dilanjutkan dengan membuka urls.py dari direktori aplikasi lalu import decorator yang udah dibuat:

# app/urls.py
from common.decorators import anonymous_required

urlpatterns = [
    # ....
]

masih di dalam file yang sama (urls.py), selanjutnya gunakan fungsi anonymous_required ke view built-in Django untuk login, seperti ini:

# app/urls.py
from django.conf.urls import url
from . import views
from common.decorators import anonymous_required
from django.contrib.auth.views import login

urlpatterns = [
 	url(r'^login/$', anonymous_required(login), name='login'),
    # ...
]

selesai, saya udah coba. pertama saya login dulu abis itu saya mengakses form login kembali. dan alhasil saya langsung di bawa kembali ke halaman dashboard (kebetulan di sini saya menggunakan dashboard untuk meredirect user kalo sudah berhasil login).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment