Sorotan Django: Model Pengguna Dan Otentikasi (Bagian 1)
Diterbitkan: 2022-03-10Ada dua jenis situs web: statis dan dinamis. Django adalah kerangka kerja untuk mengembangkan situs web dinamis. Sementara situs web statis adalah situs yang hanya menyajikan informasi, tidak ada interaksi (di luar permintaan halaman sederhana) yang didaftarkan ke server. Di situs web statis, server mengirimkan HTML, CSS, dan JavaScript ke klien dan hanya itu. Lebih banyak kemampuan memerlukan situs web dinamis, di mana server menyimpan informasi dan merespons interaksi pengguna lebih dari sekadar menyajikan halaman. Salah satu alasan utama untuk mengembangkan situs dinamis adalah untuk mengautentikasi pengguna dan membatasi konten.
Menulis, menyebarkan, dan mengelola situs web statis adalah tentang urutan besarnya lebih mudah, lebih murah, dan lebih aman daripada situs dinamis. Jadi, Anda hanya boleh membuat situs web dinamis jika kemampuan tambahan paradigma dinamis diperlukan untuk proyek Anda. Django menyederhanakan dan merampingkan proses pembuatan situs dinamis dengan komponen bawaannya. Sebagai salah satu komponen utama aplikasi web dinamis, objek "akun pengguna", seperti roda, tergoda untuk diciptakan kembali, tetapi bentuk standarnya sesuai untuk sebagian besar penggunaan. Django menyediakan model pengguna out-of-the-box yang kuat, dan dalam artikel ini, kita akan berjalan melalui cara terbaik untuk menyediakan alur otentikasi pengguna yang aman dan intuitif.
Bagian Lebih Lanjut Dalam Seri:
- Sorotan Django: Templat Menyimpan Garis (Bagian 2)
- Sorotan Django: Model, Admin, Dan Memanfaatkan Basis Data Relasional (Bagian 3)
- Sorotan Django: Perselisihan Aset Statis Dan Berkas Media (Bagian 4)
Persiapan
Jika Anda ingin membuat aplikasi Django Anda sendiri untuk bereksperimen dengan konsep dalam artikel ini, Anda dapat membuat direktori (dan lebih disukai lingkungan virtual) dan kemudian menjalankan perintah berikut:
pip install django django-admin startproject PROJECTNAME cd PROJECTNAME python manage.py startapp APPNAME python manage.py migrate python manage.py runserver
Jika Anda mencari panduan untuk membuat proyek Django pertama Anda, situs web Django sendiri menyediakan yang hebat. Dalam artikel ini, kita tidak menggunakan proyek contoh, tetapi konsep yang dibahas akan diterapkan pada hampir setiap aplikasi Django.
Model Pengguna Standar
Pada dasarnya, konsep akun pengguna ada karena dua alasan: kontrol akses dan status aplikasi yang dipersonalisasi. Kontrol akses adalah gagasan bahwa sumber daya pada sistem hanya tersedia untuk beberapa pengguna. Status yang dipersonalisasi sangat bergantung pada tujuan aplikasi tetapi dapat mencakup pengaturan, data, atau catatan lain apa pun yang spesifik untuk pengguna individu. Model User
stok Django menyediakan pendekatan yang masuk akal untuk kedua kasus penggunaan.
Awalnya, ada dua jenis pengguna dalam aplikasi Django: akun pengguna super dan pengguna biasa. Pengguna super memiliki setiap atribut dan hak istimewa dari akun biasa, tetapi juga memiliki akses ke panel admin Django, aplikasi hebat yang akan kita jelajahi secara rinci di artikel mendatang. Pada dasarnya, pengguna super dapat membuat, mengedit, atau menghapus data apa pun dalam aplikasi, termasuk akun pengguna lain.
Pada dasarnya, konsep akun pengguna ada karena dua alasan: kontrol akses dan status aplikasi yang dipersonalisasi.
“
Untuk membuat pengguna super pada aplikasi Django Anda sendiri, jalankan:
python manage.py createsuperuser
Manfaat lain dari akun pengguna adalah menyimpan data yang dipersonalisasi ke database. Secara default, Django hanya memerlukan nama pengguna dan kata sandi tetapi menyediakan bidang opsional bagi pengguna untuk memasukkan nama depan, nama belakang, dan alamat email mereka. Anda dapat membaca referensi model lengkap di situs web Django. Kita akan membahas perluasan model ini di bawah.
Keamanan Dan Keandalan
Django menyertakan middleware manajemen kata sandi substansial dengan model pengguna. Kata sandi pengguna harus minimal 8 karakter, tidak seluruhnya angka, tidak terlalu cocok dengan nama pengguna, dan tidak termasuk dalam daftar 20.000 kata sandi paling umum. Formulir stok Django memvalidasi persyaratan ini. Ketika kata sandi dikirim ke server, itu dienkripsi sebelum disimpan, secara default menggunakan algoritma PBKDF2 dengan hash SHA256. Secara keseluruhan, sistem kata sandi default memberikan keamanan yang kuat tanpa upaya apa pun dari pengembang. Kecuali Anda memiliki keahlian khusus dan alasan kuat untuk mengubah cara penanganan sandi di aplikasi Anda, jangan ubah perilaku ini.
Satu built-in yang nyaman lainnya adalah persyaratan bahwa nama pengguna itu unik. Jika Anda memikirkannya, jika ada dua pengguna dengan nama pengguna “djangofan1” dan server menerima permintaan masuk untuk nama pengguna itu, ia tidak akan tahu pengguna mana yang mencoba mengakses aplikasi. Sayangnya bagi mereka, pengguna kedua yang mencoba mendaftar dengan "djangofan1" harus memilih nama yang berbeda, mungkin "djangofan2". Batasan keunikan ini diberlakukan pada tingkat basis data tetapi diverifikasi lagi oleh bentuk-bentuk yang disediakan Django.
Akhirnya, catatan tentang menghapus pengguna. Meskipun menghapus pengguna adalah suatu kemungkinan, sebagian besar aplikasi kompleks akan memiliki sejumlah sumber daya yang terkait dengan setiap akun pengguna. Jika Anda ingin menghapus pengguna secara efektif tanpa menghapus objek yang dilampirkan tersebut, setel bidang is_active
pengguna ke false sebagai gantinya. Kemudian, sumber daya lain tersebut tetap terkait dengan akun daripada dihapus sendiri, dan akun pengguna dapat diaktifkan kembali kapan saja oleh pengguna super. Perhatikan bahwa ini tidak membebaskan nama pengguna, tetapi menyetel akun sebagai tidak aktif bersama dengan mengubah nama pengguna menjadi nilai unik dan acak dapat mencapai efek yang sama. Terakhir, jika kebijakan situs Anda atau hukum setempat yang berlaku mengharuskan akun pengguna dapat dihapus sepenuhnya, pendekatan is_active
tidak akan cukup.
Kecuali Anda memiliki keahlian khusus dan alasan kuat untuk mengubah cara penanganan sandi di aplikasi Anda, jangan ubah perilaku ini.
“
Penggunaan Standar
Saat Anda ingin mendaftarkan akun pengguna baru, tampilan untuk melakukannya mungkin akan terlihat seperti berikut di views.py :
from django.shortcuts import render, redirect from django.contrib.auth import authenticate, login from django.contrib.auth.forms import UserCreationForm def signup(request): if request.user.is_authenticated: return redirect('/') if request.method == 'POST': form = UserCreationForm(request.POST) if form.is_valid(): form.save() username = form.cleaned_data.get('username') password = form.cleaned_data.get('password1') user = authenticate(username=username, password=password) login(request, user) return redirect('/') else: return render(request, 'signup.html', {'form': form}) else: form = UserCreationForm() return render(request, 'signup.html', {'form': form})
Mari kita uraikan:
- Jika pengguna sudah masuk, kami akan mengalihkan mereka dari halaman pendaftaran.
- Jika metode request adalah POST, berarti form untuk membuat user sudah diisi dan saatnya membuat user.
- Pertama, buat objek formulir di backend dengan data yang disediakan pengguna.
- Jika formulir valid, buat pengguna dan login, lalu kirim ke halaman utama.
- Jika tidak, buang kembali ke halaman pembuatan pengguna dengan informasi tentang data apa yang tidak valid (misalnya, mereka meminta nama pengguna yang sudah digunakan).
- Jika tidak, pengguna mengakses halaman untuk pertama kalinya dan harus bertemu dengan formulir untuk membuat akun baru.
Sekarang memeriksa proses masuk akun:
from django.shortcuts import render, redirect from django.contrib.auth import authenticate, login from django.contrib.auth.forms import AuthenticationForm def signin(request): if request.user.is_authenticated: return render(request, 'homepage.html') if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return redirect('/') else: form = AuthenticationForm(request.POST) return render(request, 'signin.html', {'form': form}) else: form = AuthenticationForm() return render(request, 'signin.html', {'form': form})
Kerusakan lain:
- Jika pengguna sudah masuk, kami akan mengalihkan mereka dari halaman masuk.
- Jika metode permintaan adalah POST, itu berarti formulir untuk masuk telah diisi dan saatnya untuk mengautentikasi pengguna ke akun.
- Pertama, autentikasi pengguna dengan data yang disediakan pengguna
- Jika nama pengguna dan kata sandi sesuai dengan akun, login pengguna
- Jika tidak, bawa mereka kembali ke halaman masuk dengan informasi formulir yang telah diisi sebelumnya
- Jika tidak, pengguna mengakses halaman untuk pertama kalinya dan harus bertemu dengan formulir untuk masuk.
Terakhir, pengguna Anda mungkin ingin keluar. Kode dasar untuk permintaan ini sederhana:
from django.shortcuts import render, redirect from django.contrib.auth import logout def signout(request): logout(request) return redirect('/')
Setelah pengguna masuk ke akun mereka, dan sampai mereka keluar dari perangkat itu, mereka memiliki "sesi." Selama waktu ini, permintaan berikutnya dari browser mereka akan dapat mengakses halaman khusus akun. Seorang pengguna dapat memiliki beberapa sesi aktif secara bersamaan. Secara default, sesi tidak time out.
Saat pengguna memiliki sesi aktif di perangkat mereka, mereka akan mendaftar sebagai True
untuk pemeriksaan request.user.is_authenticated
. Cara lain untuk membatasi halaman hanya untuk pengguna yang masuk adalah dekorator @login_required
di atas suatu fungsi. Ada beberapa cara lain untuk mencapai hal yang sama, dirinci di sini.
Jika tingkat konfigurasi ini lebih dari yang ingin Anda lakukan, ada pendekatan yang lebih out-of-the-box untuk manajemen pengguna. Tampilan autentikasi stok ini menyediakan rute, tampilan, dan formulir standar untuk manajemen pengguna dan dapat dimodifikasi dengan menetapkannya ke URL kustom, meneruskan templat kustom, atau bahkan mensubklasifikasikan tampilan untuk kontrol lebih lanjut.
Memperluas Model Pengguna
Umumnya, Anda perlu memperluas model pengguna untuk menyediakan kontrol akses yang lebih detail atau menyimpan lebih banyak data pengguna per akun. Kami akan menjelajahi beberapa kasus umum di bawah ini.
Menjatuhkan Bidang Dari Model Pengguna
Bertentangan dengan tajuk bagian ini, saya sebenarnya tidak merekomendasikan membuat perubahan langsung ke model pengguna atau skema basis data terkait! Model pengguna generik ditetapkan dalam basis data Anda secara default selama penyetelan proyek Django baru. Begitu banyak yang terkait dengan model pengguna default sehingga mengubahnya dapat memiliki efek yang tidak terduga dalam aplikasi Anda (terutama jika Anda menggunakan perpustakaan pihak ketiga), oleh karena itu, menambahkan atau menghapus bidang tidak disarankan dan tidak dipermudah oleh kerangka kerja.
Secara default, hanya dua bidang yang diperlukan untuk pengguna adalah nama pengguna dan kata sandi. Jika Anda tidak ingin menggunakan bidang lain, abaikan saja keberadaannya, karena pengguna dapat dibuat tanpa nama depan, nama belakang, atau alamat email. Ada kumpulan bidang default seperti last_login dan date_joined yang juga dapat diabaikan jika Anda tidak menginginkannya. Jika Anda memiliki kendala teknis aktual yang mengharuskan penghapusan bidang opsional dari model pengguna, Anda pasti sudah mengetahuinya dan tidak memerlukan artikel ini.
Alasan umum Anda mungkin ingin menghapus bidang dalam model pengguna adalah untuk menghapus nama pengguna demi email sebagai pengenal unik. Dalam hal ini, saat membuat pengguna dari data formulir atau mengautentikasi permintaan, cukup masukkan alamat email sebagai nama pengguna selain penggunaannya di bidang email. Bidang nama pengguna masih akan menerapkan batasan keunikan saat nama pengguna diformat sebagai alamat email. String adalah string, mereka akan diperlakukan sama.
Begitu banyak yang terkait dengan model pengguna default sehingga mengubahnya dapat memiliki efek yang tidak diharapkan pada aplikasi Anda, terutama jika Anda menggunakan pustaka pihak ketiga.
“
Menambahkan Bidang Dengan Profil
Demikian pula, jika Anda ingin menyimpan informasi tambahan tentang pengguna Anda, Anda tidak boleh mencoba mengubah model pengguna default. Bahkan untuk satu bidang, tentukan objek Anda sendiri dengan hubungan satu-ke-satu dengan pengguna yang ada. Model tambahan ini sering disebut Profile
. Katakanlah Anda ingin menyimpan nama tengah dan tanggal lahir (dob) untuk setiap pengguna. Profile
akan didefinisikan sebagai berikut di models.py :
from django.db import models from django.contrib.auth.models import User class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) middle_name = models.CharField(max_length=30, blank=True) dob = models.DateField(null=True, blank=True)
Kontrol Akses Kustom
Aplikasi Anda mungkin memerlukan perbedaan antara tipe pengguna yang berbeda untuk mengakses informasi dan fungsi. Django menyediakan sistem untuk membuat kontrol akses berbutir halus khusus: izin dan grup.
Izin adalah objek yang menentukan akses ke sumber daya. Seorang pengguna dapat memiliki satu atau lebih izin. Misalnya, mereka mungkin memiliki akses baca ke tabel produk dan akses tulis ke tabel pelanggan. Implementasi yang tepat dari izin bervariasi secara substansial menurut aplikasi tetapi pendekatan Django membuatnya intuitif untuk mendefinisikan izin untuk data dan menetapkan izin tersebut kepada pengguna.
Aplikasi untuk perusahaan dan organisasi besar lainnya sering menerapkan kontrol akses berbasis peran. Pada dasarnya, pengguna dapat memiliki berbagai peran, yang masing-masing memiliki izin tertentu. Alat Django untuk mengimplementasikan pola ini adalah Group. Grup dapat memiliki sejumlah izin, yang masing-masing dapat ditetapkan ke sejumlah grup. Seorang pengguna kemudian mendapatkan izin tidak secara langsung tetapi dengan keanggotaan mereka ke grup, membuat aplikasi lebih mudah untuk dikelola.
Ikhtisar: Mengintegrasikan Penyedia Pembayaran
Proses yang tepat untuk mengintegrasikan pemroses pembayaran sangat bervariasi menurut aplikasi dan penyedia. Namun, saya akan membahas prosesnya secara umum.
Salah satu keuntungan utama pembayaran outsourcing adalah penyedia bertanggung jawab untuk menyimpan dan memvalidasi data yang diatur secara ketat seperti informasi kartu kredit. Layanan kemudian membagikan beberapa token pengguna unik dengan aplikasi Anda bersama dengan data tentang riwayat pembayaran mereka. Seperti menambahkan profil, Anda dapat membuat model yang terkait dengan User
inti dan menyimpan data dalam model itu. Seperti halnya kata sandi, penting untuk mengikuti integrasi yang diberikan dengan penyedia untuk menghindari penyimpanan informasi sensitif secara tidak benar.
Ikhtisar: Masuk Sosial
Bidang luas dan kompleks lainnya yang ingin saya sentuh secara singkat adalah sign-in sosial. Platform besar seperti Facebook dan Google, serta situs yang lebih kecil seperti GitHub, menyediakan API untuk menggunakan layanan mereka untuk mengautentikasi pengguna. Mirip dengan penyedia pembayaran, ini membuat catatan di database Anda yang menautkan akun ke akun di database mereka.
Anda mungkin ingin menyertakan autentikasi sosial di situs Anda untuk memudahkan pengguna mendaftar tanpa membuat set kredensial login baru. Jika aplikasi Anda hanya menargetkan pelanggan yang sudah menggunakan situs tertentu yang menyediakan opsi autentikasi sosial, aplikasi ini mungkin membantu Anda menarik pengguna dari pasar tersebut dengan menurunkan hambatan masuk. Selain itu, jika aplikasi Anda bermaksud mengakses data pengguna dari layanan pihak ketiga, menautkan akun selama autentikasi akan menyederhanakan proses pemberian izin.
Namun, ada kerugian menggunakan auth sosial. Perubahan atau penghentian API dari penyedia pihak ketiga dapat mengganggu waktu aktif atau aktivitas pengembangan aplikasi Anda. Secara umum, dependensi eksternal menambah kompleksitas aplikasi. Terakhir, ada baiknya mempertimbangkan pengumpulan data dan kebijakan penggunaan pihak ketiga yang Anda integrasikan dan pastikan kebijakan tersebut sesuai dengan harapan Anda dan pengguna Anda.
Jika Anda memutuskan bahwa otentikasi sosial tepat untuk aplikasi Anda, untungnya, ada perpustakaan untuk itu. Python Social Auth untuk Django adalah paket untuk mengaktifkan kemampuan ekosistem auth sosial Python dalam proyek Django.
Membungkus
Sama universalnya dengan akun pengguna, penggunaannya secara luas dapat menyebabkan penyelesaian masalah yang sama secara tidak perlu. Semoga artikel ini menunjukkan kepada Anda berbagai fitur canggih yang tersedia di Django dan memberi Anda pemahaman tentang tanggung jawab dasar aplikasi saat membuat akun pengguna.
Django Highlights adalah seri yang memperkenalkan konsep penting pengembangan web di Django. Setiap artikel ditulis sebagai panduan yang berdiri sendiri untuk aspek pengembangan Django yang dimaksudkan untuk membantu pengembang dan perancang front-end mencapai pemahaman yang lebih dalam tentang "separuh lainnya" dari basis kode. Artikel-artikel ini sebagian besar dibangun untuk membantu Anda memperoleh pemahaman tentang teori dan konvensi tetapi berisi beberapa contoh kode, yang ditulis dalam Django 3.0. Beberapa konsep yang kami sentuh dalam artikel ini, termasuk template, pengguna admin, model, dan formulir, akan dieksplorasi satu per satu secara rinci di artikel mendatang dalam seri ini.
Bagian Selanjutnya Dalam Seri:
- Sorotan Django: Templat Menyimpan Garis (Bagian 2)
- Sorotan Django: Model, Admin, Dan Memanfaatkan Basis Data Relasional (Bagian 3)
- Sorotan Django: Perselisihan Aset Statis Dan Berkas Media (Bagian 4)