Django'da Öne Çıkanlar: Kullanıcı Modelleri ve Kimlik Doğrulama (Bölüm 1)

Yayınlanan: 2022-03-10
Hızlı özet ↬ Dinamik bir site geliştirmenin başlıca nedenlerinden biri, kullanıcıların kimliğini doğrulamak ve içeriği kısıtlamaktır. Django, kullanıma hazır güçlü bir kullanıcı modeli sağlar ve bu makalede, güvenli, sezgisel kullanıcı kimlik doğrulama akışları sağlamanın en iyi yolunu inceleyeceğiz.

İki tür web sitesi vardır: statik ve dinamik. Django, dinamik web siteleri geliştirmek için bir çerçevedir. Statik bir web sitesi yalnızca bilgi sunan bir web sitesi olsa da, bir sunucuya kaydolan hiçbir etkileşim (basit sayfa isteklerinin ötesinde) yoktur. Statik bir web sitesinde sunucu, bir istemciye HTML, CSS ve JavaScript gönderir ve hepsi bu kadar. Daha fazla yetenek, sunucunun bilgi depoladığı ve yalnızca sayfaları sunmanın ötesinde kullanıcı etkileşimine yanıt verdiği dinamik bir web sitesi gerektirir. Dinamik bir site geliştirmenin başlıca nedenlerinden biri, kullanıcıların kimliğini doğrulamak ve içeriği kısıtlamaktır.

Statik bir web sitesi yazmak, dağıtmak ve yönetmek, dinamik bir siteden çok daha kolay, daha ucuz ve daha güvenlidir. Bu nedenle, yalnızca projeniz için dinamik paradigmanın ek yetenekleri gerekliyse dinamik bir web sitesi oluşturmalısınız. Django, yerleşik bileşenleriyle dinamik bir site oluşturma sürecini basitleştirir ve düzenler. Dinamik bir web uygulamasının birincil bileşenlerinden biri olarak, tekerlek gibi "kullanıcı hesabı" nesnesi yeniden icat etmek için caziptir, ancak standart şekil çoğu kullanım için uygundur. Django, kullanıma hazır güçlü bir kullanıcı modeli sağlar ve bu makalede, güvenli, sezgisel kullanıcı kimlik doğrulama akışları sağlamanın en iyi yolunu inceleyeceğiz.

Serideki Diğer Parçalar :

  • Django'da Öne Çıkanlar: Şablon Oluşturma Satırları Kaydediyor (2. Kısım)
  • Django'nun Öne Çıkanları: Modeller, Yönetici ve İlişkisel Veritabanından Yararlanma (3. Kısım)
  • Django'nun Öne Çıkanları: Statik Varlıkları ve Medya Dosyalarını Uğraşmak (4. Kısım)

Kurulum

Bu makaledeki kavramları denemek için kendi Django uygulamanızı oluşturmak istiyorsanız, bir dizin (ve tercihen bir sanal ortam) oluşturabilir ve ardından aşağıdaki komutları çalıştırabilirsiniz:

 pip install django django-admin startproject PROJECTNAME cd PROJECTNAME python manage.py startapp APPNAME python manage.py migrate python manage.py runserver

İlk Django projenizi oluşturmak için bir yol arıyorsanız, Django'nun kendi web sitesi size harika bir proje sunuyor. Bu yazıda örnek bir proje kullanmıyoruz, ancak tartışılan kavramlar hemen hemen her Django uygulaması için geçerli olacak.

Atlamadan sonra daha fazlası! Aşağıdan okumaya devam edin ↓

Standart Kullanıcı Modeli

Temel olarak, bir kullanıcı hesabı kavramı iki nedenden dolayı mevcuttur: erişim kontrolü ve kişiselleştirilmiş uygulama durumu. Erişim denetimi, bir sistemdeki kaynakların yalnızca bazı kullanıcılar tarafından kullanılabilir olduğu fikridir. Kişiselleştirilmiş durum, büyük ölçüde uygulamanın amacına bağlıdır ancak ayarları, verileri veya bireysel bir kullanıcıya özel diğer kayıtları içerebilir. Django stok User modeli, her iki kullanım durumu için de mantıklı yaklaşımlar sağlar.

Başlangıçta, bir Django uygulamasında iki tür kullanıcı vardır: süper kullanıcı hesapları ve normal kullanıcılar. Süper kullanıcılar, normal hesapların her özelliğine ve ayrıcalığına sahiptir, ancak aynı zamanda, ilerideki bir makalede ayrıntılı olarak inceleyeceğimiz güçlü bir uygulama olan Django yönetici paneline de erişebilir. Esasen, süper kullanıcılar, diğer kullanıcı hesapları da dahil olmak üzere uygulamadaki herhangi bir veriyi oluşturabilir, düzenleyebilir veya silebilir.

Temel olarak, bir kullanıcı hesabı kavramı iki nedenden dolayı mevcuttur: erişim kontrolü ve kişiselleştirilmiş uygulama durumu.

Kendi Django uygulamanızda bir süper kullanıcı oluşturmak için şunu çalıştırın:

 python manage.py createsuperuser

Bir kullanıcı hesabının diğer yararı, kişiselleştirilmiş verileri veritabanına depolamaktır. Varsayılan olarak, Django yalnızca bir kullanıcı adı ve parola gerektirir, ancak kullanıcıların adlarını, soyadlarını ve e-posta adreslerini girmeleri için isteğe bağlı alanlar sağlar. Tam bir model referansını Django web sitesinde okuyabilirsiniz. Aşağıda bu modeli genişletmeyi tartışacağız.

Güvenlik ve Güvenilirlik

Django, kullanıcı modeliyle birlikte önemli bir parola yönetimi ara yazılımı içerir. Kullanıcı parolalarının tam sayı değil en az 8 karakterden oluşması, kullanıcı adıyla çok yakın eşleşmemesi ve en yaygın 20.000 parola listesinde yer almaması gerekir. Django stok formları bu gereksinimleri doğrular. Sunucuya bir parola gönderildiğinde, saklanmadan önce, varsayılan olarak bir SHA256 karma ile PBKDF2 algoritması kullanılarak şifrelenir. Genel olarak, varsayılan şifre sistemi, geliştiricinin herhangi bir çabası olmadan sağlam güvenlik sağlar. Uygulamanızda parolaların işlenme şeklini değiştirmek için özel bir uzmanlığa ve zorunlu bir nedene sahip değilseniz, bu davranışı değiştirmeyin.

Bir diğer kullanışlı yerleşik, kullanıcı adlarının benzersiz olması gerekliliğidir. Düşünürseniz, “djangofan1” kullanıcı adına sahip iki kullanıcı olsaydı ve sunucu bu kullanıcı adı için bir oturum açma talebi alsa, hangi kullanıcının uygulamaya erişmeye çalıştığını bilemezdi. Ne yazık ki onlar için “djangofan1”e kaydolmayı deneyecek olan ikinci kullanıcının farklı bir isim, belki de “djangofan2” seçmesi gerekecek. Bu benzersizlik kısıtlaması veritabanı düzeyinde uygulanır ancak yine Django'nun sağladığı formlarla doğrulanır.

Son olarak, kullanıcıları silmeyle ilgili bir not. Kullanıcıları silmek bir olasılık olsa da, çoğu karmaşık uygulamanın her kullanıcı hesabına bağlı bir dizi kaynağı olacaktır. Bir kullanıcıyı ekli nesneleri kaldırmadan etkili bir şekilde silmek istiyorsanız, bunun yerine kullanıcının is_active alanını false olarak ayarlayın. Ardından, bu diğer kaynaklar kendileri silinmek yerine hesapla ilişkili kalır ve kullanıcı hesabı herhangi bir zamanda bir süper kullanıcı tarafından yeniden etkinleştirilebilir. Bunun kullanıcı adını serbest bırakmadığını, ancak kullanıcı adını rastgele, benzersiz bir değerle değiştirmekle birlikte hesabı etkin olmayan olarak ayarlamak aynı etkiyi sağlayabilir. Son olarak, site politikalarınız veya geçerli yerel yasalar, kullanıcı hesaplarının tamamen silinebilir olmasını gerektiriyorsa, is_active yaklaşımı yeterli olmayacaktır.

Uygulamanızda parolaların işlenme şeklini değiştirmek için özel bir uzmanlığa ve zorunlu bir nedene sahip değilseniz, bu davranışı değiştirmeyin.

Standart Kullanım

Yeni bir kullanıcı hesabı kaydetmek istediğinizde, bunu yapmak için görünüm muhtemelen views.py'de aşağıdaki gibi görünecektir:

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

Bunu parçalayalım:

  • Kullanıcı zaten oturum açmışsa, onları kayıt sayfasından başka bir yere yönlendireceğiz.
  • İstek yöntemi POST ise, bu, kullanıcı oluşturma formunun zaten doldurulmuş olduğu ve bir kullanıcı oluşturma zamanının geldiği anlamına gelir.
    • İlk olarak, kullanıcı tarafından sağlanan verilerle arka uçta form nesnesini oluşturun.
    • Form geçerliyse, kullanıcıyı oluşturun ve oturum açın, ardından ana sayfaya gönderin.
    • Aksi takdirde, hangi verilerin geçersiz olduğuna ilişkin bilgilerle birlikte bunları kullanıcı oluşturma sayfasına geri gönderin (örneğin, zaten kullanımda olan bir kullanıcı adı istediler).
  • Aksi takdirde, kullanıcı sayfaya ilk kez giriyor ve yeni bir hesap oluşturma formu ile karşılanmalıdır.

Şimdi hesap oturum açmayı inceliyoruz:

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

Başka bir dağılım:

  • Kullanıcı zaten oturum açmışsa, onları oturum açma sayfasından başka bir yere yönlendireceğiz.
  • İstek yöntemi POST ise, bu, oturum açma formunun doldurulduğu ve kullanıcının bir hesapta kimliğini doğrulama zamanının geldiği anlamına gelir.
    • İlk olarak, kullanıcı tarafından sağlanan verilerle kullanıcının kimliğini doğrulayın
    • Kullanıcı adı ve parola bir hesaba karşılık geliyorsa, kullanıcıyı oturum açın
    • Aksi takdirde, onları form bilgileri önceden doldurulmuş olarak oturum açma sayfasına geri getirin.
  • Aksi takdirde kullanıcı sayfaya ilk defa giriyor ve giriş için form ile karşılaşmalıdır.

Son olarak, kullanıcılarınız sonunda çıkış yapmak isteyebilir. Bu istek için temel kod basittir:

 from django.shortcuts import render, redirect from django.contrib.auth import logout def signout(request): logout(request) return redirect('/')

Kullanıcı hesabına giriş yaptıktan sonra ve o cihazda çıkış yapana kadar bir "oturum" yaşarlar. Bu süre boyunca, tarayıcılarından gelen sonraki istekler yalnızca hesap sayfalarına erişebilecek. Bir kullanıcının aynı anda birden fazla oturumu etkin olabilir. Varsayılan olarak, oturumlar zaman aşımına uğramaz.

Bir kullanıcının cihazında etkin bir oturumu olduğunda, request.user.is_authenticated kontrolü için True olarak kaydolur. Sayfaları yalnızca oturum açmış kullanıcılarla kısıtlamanın başka bir yolu, bir işlevin üzerindeki @login_required dekoratörüdür. Aynı şeyi elde etmenin birçok başka yolu vardır, burada ayrıntılı olarak açıklanmıştır.

Bu yapılandırma düzeyi gerçekleştirmek istediğinizden daha fazlaysa, kullanıcı yönetimine yönelik kullanıma hazır bir yaklaşım daha vardır. Bu stok doğrulama görünümleri, kullanıcı yönetimi için standart yollar, görünümler ve formlar sağlar ve bunları özel URL'lere atayarak, özel şablonları ileterek ve hatta daha fazla kontrol için görünümleri alt sınıflara ayırarak değiştirilebilir.

Kullanıcı Modelini Genişletme

Genel olarak, daha ayrıntılı erişim kontrolleri sağlamak veya hesap başına daha fazla kullanıcı verisi depolamak için kullanıcı modelini genişletmeniz gerekir. Aşağıda birkaç yaygın durumu inceleyeceğiz.

Kullanıcı Modelinden Alan Bırakma

Bu bölümün başlığının aksine, aslında doğrudan kullanıcı modelinde veya ilişkili veritabanı şemasında değişiklik yapmanızı önermiyorum! Genel kullanıcı modeli, yeni bir Django projesinin kurulumu sırasında varsayılan olarak veritabanınızda kurulur. Varsayılan kullanıcı modeline o kadar çok şey bağlıdır ki, onu değiştirmenin uygulamanızda beklenmedik etkileri olabilir (özellikle üçüncü taraf kitaplıkları kullanıyorsanız), buna göre alan ekleme veya kaldırma önerilmez ve çerçeve tarafından kolay yapılmaz.

Varsayılan olarak, bir kullanıcı için gerekli olan yalnızca iki alan kullanıcı adı ve paroladır. Diğer alanlardan herhangi birini kullanmak istemiyorsanız, bir kullanıcı adı, soyadı veya e-posta adresi olmadan oluşturulabileceğinden bunların varlığını görmezden gelin. Last_login ve date_joined gibi, istemiyorsanız göz ardı edilebilecek bir varsayılan alanlar koleksiyonu vardır. Kullanıcı modelinden isteğe bağlı alanların çıkarılmasını gerektiren gerçek bir teknik kısıtlamanız olsaydı, bunu zaten bilirdiniz ve bu makaleye ihtiyacınız olmazdı.

Kullanıcı modelinde bir alan bırakmak isteyebileceğiniz yaygın bir neden, benzersiz bir tanımlayıcı olarak e-posta lehine kullanıcı adını bırakmaktır. Bu durumda, kullanıcıyı form verilerinden oluştururken veya bir isteği doğrularken, e-posta alanına kullanımına ek olarak kullanıcı adı olarak e-posta adresini girmeniz yeterlidir. Kullanıcı adları e-posta adresleri olarak biçimlendirildiğinde, kullanıcı adı alanı benzersizlik kısıtlamasını uygulamaya devam edecektir. Dizeler dizelerdir, aynı şekilde ele alınacaktır.

Varsayılan kullanıcı modeline o kadar çok şey bağlıdır ki, özellikle üçüncü taraf kitaplıkları kullanıyorsanız, onu değiştirmenin uygulamanızda beklenmedik etkileri olabilir.

Profille Alan Ekleme

Benzer şekilde, kullanıcılarınız hakkında ek bilgi depolamak istiyorsanız, varsayılan kullanıcı modelini değiştirmeye çalışmamalısınız. Tek bir alan için bile, mevcut kullanıcılarla bire bir ilişki ile kendi nesnenizi tanımlayın. Bu ekstra modele genellikle Profile denir. Her kullanıcı için bir göbek adı ve doğum tarihi (dob) saklamak istediğinizi varsayalım. Profile , models.py dosyasında aşağıdaki gibi tanımlanır:

 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)

Özel Erişim Kontrolü

Uygulamanız, bilgi ve işlevlere erişim için farklı kullanıcı türleri arasında bir ayrım gerektirmiş olabilir. Django, özel ayrıntılı erişim denetimi oluşturmak için bir sistem sağlar: izinler ve gruplar.

İzinler, kaynaklara erişimi belirleyen nesnelerdir. Bir kullanıcının bir veya daha fazla izni olabilir. Örneğin, bir ürün tablosuna okuma erişimine ve bir müşteri tablosuna yazma erişimine sahip olabilirler. İznin tam olarak uygulanması, uygulamaya göre büyük ölçüde değişir, ancak Django'nun yaklaşımı, veriler için izinleri tanımlamayı ve bu izinleri kullanıcılara atamayı sezgisel hale getirir.

Kurumsal ve diğer büyük kuruluşlar için uygulamalar genellikle rol tabanlı erişim denetimi uygular. Esasen, bir kullanıcı, her biri belirli izinlere sahip olan çeşitli rollere sahip olabilir. Django'nun bu kalıbı uygulamak için kullandığı araç Grup'tur. Bir grup, her biri herhangi bir sayıda gruba atanabilecek herhangi bir sayıda izne sahip olabilir. Bir kullanıcı daha sonra doğrudan değil, gruplara üyelikleri yoluyla izinler alır ve uygulamanın yönetimini kolaylaştırır.

Genel Bakış: Bir Ödeme Sağlayıcısını Entegre Etme

Bir ödeme işlemcisini entegre etmenin kesin süreci, uygulamaya ve sağlayıcıya göre büyük ölçüde değişir. Ancak, süreci genel hatlarıyla ele alacağım.

Dış kaynak ödemelerinin en önemli avantajlarından biri, sağlayıcının kredi kartı bilgileri gibi yüksek düzeyde düzenlenmiş verileri depolamaktan ve doğrulamaktan sorumlu olmasıdır. Daha sonra hizmet, ödeme geçmişleriyle ilgili verilerle birlikte bazı benzersiz kullanıcı belirteçlerini uygulamanızla paylaşır. Profil eklemek gibi, çekirdek User ile ilişkili bir model oluşturabilir ve verileri bu modelde saklayabilirsiniz. Parolalarda olduğu gibi, hassas bilgilerin uygun olmayan şekilde saklanmasını önlemek için sağlayıcı ile verilen entegrasyonu takip etmek önemlidir.

Genel Bakış: Sosyal Oturum Açma

Kısaca değinmek istediğim diğer geniş, karmaşık alan sosyal oturum açmadır. Facebook ve Google gibi büyük platformların yanı sıra GitHub gibi daha küçük siteler, hizmetlerini kullanıcıların kimliğini doğrulamak için kullanmak için API'ler sağlar. Bir ödeme sağlayıcısına benzer şekilde, bu, veritabanınızda bir hesabı kendi veritabanındaki bir hesaba bağlayan bir kayıt oluşturur.

Kullanıcıların yeni bir oturum açma kimlik bilgileri seti oluşturmadan kaydolmasını kolaylaştırmak için sitenize sosyal kimlik doğrulaması eklemek isteyebilirsiniz. Uygulamanız yalnızca sosyal kimlik doğrulama seçeneği sunan belirli bir siteyi zaten kullanan müşterileri hedefliyorsa, giriş engelini azaltarak bu pazardan kullanıcıları çekmenize yardımcı olabilir. Ayrıca, uygulamanız bir üçüncü taraf hizmetten kullanıcının verilerine erişmeyi planlıyorsa, kimlik doğrulama sırasında hesapları bağlamak, izin verme sürecini basitleştirir.

Ancak, sosyal auth kullanmanın dezavantajları vardır. Üçüncü taraf sağlayıcıdan kaynaklanan API değişiklikleri veya kesintileri, uygulamanızın çalışma süresini veya geliştirme etkinliklerini kesintiye uğratabilir. Genel olarak, dış bağımlılıklar uygulamaya karmaşıklık katar. Son olarak, entegre olduğunuz üçüncü tarafların veri toplama ve kullanım politikalarını göz önünde bulundurmanız ve bunların sizin ve kullanıcılarınızın beklentileriyle uyumlu olduğundan emin olmanız gerekir.

Sosyal kimlik doğrulamanın uygulamanız için doğru olduğuna karar verirseniz, neyse ki bunun için bir kitaplık var. Python Social Auth for Django, Python'un sosyal auth ekosisteminin Django projelerinde yeteneklerini etkinleştirmeye yönelik bir pakettir.

Toplama

Kullanıcı hesabı ne kadar evrensel olursa olsun, yaygın kullanımı aynı sorunların gereksiz yere çözülmesine yol açabilir. Umarız bu makale size Django'da bulunan güçlü özellikler yelpazesini göstermiş ve kullanıcı hesapları oluştururken bir uygulamanın temel sorumluluklarını anlamanızı sağlamıştır.

Django Highlights, Django'da web geliştirmenin önemli kavramlarını tanıtan bir seridir. Her makale, ön uç geliştiricilerin ve tasarımcıların kod tabanının "diğer yarısı" hakkında daha derin bir anlayışa ulaşmalarına yardımcı olmayı amaçlayan Django geliştirmesinin bir yönüne yönelik bağımsız bir kılavuz olarak yazılmıştır. Bu makaleler çoğunlukla teori ve uzlaşımı anlamanıza yardımcı olmak için oluşturulmuştur, ancak Django 3.0'da yazılmış bazı kod örnekleri içerir. Şablonlar, yönetici kullanıcılar, modeller ve formlar dahil olmak üzere bu makalede değindiğimiz çeşitli kavramlar, bu serinin gelecekteki makalelerinde ayrı ayrı ayrıntılı olarak incelenecektir.

Serideki Diğer Parçalar :

  • Django'da Öne Çıkanlar: Şablon Oluşturma Satırları Kaydediyor (2. Kısım)
  • Django'nun Öne Çıkanları: Modeller, Yönetici ve İlişkisel Veritabanından Yararlanma (3. Kısım)
  • Django'nun Öne Çıkanları: Statik Varlıkları ve Medya Dosyalarını Uğraşmak (4. Kısım)