Flask Tutorial Login Operations

5-FlaskLogin

User Log-in operations (Kullanıcı giriş işlemleri)

Password Hashing
  • User modelinde password_hash alanını tanımladık ancak password hashing işlemini gerçekleştirmedik.
  • Hashing; matematiksel bir fonksiyon kullanarak belirli bir string veya karakterlerden bir değer veya değerler üretmektir.
  • Password Hashing ise parolaların belirli fonksiyonlar kullanılarak mevcut parola stringi yerine daha güçlü, karmaşık, güvenli değer üretme işlemidir.
  • Werkzeug'un bize sunduğu method yardımı ile projemizde parolalarımızı güvenli şekilde veritabanında tutacağız.
 
  • Gördüğünüz üzere gizli-parolam stringine karşılık üretilen değer oldukça güçlü.
  • Her seferinde farklı string üretilir. Böylece aynı parolaya sahip kullanıcılar için hash sonucu farklı olur ve tespit edilmesi imkansız değerler üretilir.
 
  • Hash işlemi yapılmış parolanın kontrolü için de check_password_hash() methodunu kullanıyoruz.
  • Şimdi password hash işlemini User modelimize uygulayalım. myapp/models.py
 
  • Bu methodlar yardımı ile kullanıcı güçlü ve güvenli bir parolaya sahip olacak.
  • flask shell ile terminalden Shell ortamına geçelim.
 
Flask Log-in kullanımı
  • Flask Log-in Extension'ı:

    • Kullanıcı log-in olmuşsa, görebileceği sayfalar arasında tekrar tekrar giriş yapmadan (log-in olmadan) gezinebilir.
    • Remember me (Beni hatırla) fonksiyonelliği sağlar. Böylece browser kapansa bile giriş yapmaya olanak sağlar.
    • pip install flask-login ile extension'ı kuruyoruz.
    • Diğer extension'lar gibi Flask-Login de myapp/__init__.py içerisinde application instance oluşturulduktan sonra eklenecek.
 
Flask-Login için User modelin hazırlanması
  • is_authenticated : Kullanıcı geçerli yetkilere sahip ise True değilse False döner.
  • is_active : Kullanıcı aktif ise True değilse False döner.
  • is_anonymous : Kullanıcı sıradan kullanıcı ise False, değilse True döner.
  • get_id() : Kullanıcı için unique identifier dönen method.
  • Yukarıdaki dörtlüyü UserMixin sınıfı ile kolayca User modelimize implement edebiliriz. myapp/models.py
 
  • Burada ayrıca pythondaki multiple inheritance örneğini de görmektesiniz.
user_loader Fonksiyonu.
  • Flask Login, Flask'in user sessionında(uygulamaya bağlanan her kullanıcı için atanmış depolama alanı) giriş yapan kullanıcının unique ID'sini izler.
  • Kullanıcı sayfayı değiştirdikçe Flask Login user session'dan kullanıcı ID'sini okur ve kullanıcıyı hafızaya yükler.
  • Flask Login'in kullanıcıyı ID'sinden yüklemesi için myapp/models.py modülümüze load_user methodu ekleyeceğiz.
 
  • user_loader Flask Login extension'ı ile kayıtlıdır.
  • Flask Login id'yi string olarak fonksiyona göndereceği için database query işleminde integer'a convert ettik.
Projemizde Kulanıcı Giriş İşlemleri (User Login Operations) myapp/routes.py
 
  • current_user: Flask Login extension'ının bize sağladığı, istemciyi(client) temsil eden user objesidir. is_authenticated daha önce bahsedildiği gibi kullanıcı login olmuşsa True değilse False dönen özelliktir(property).
  • filter_by() methodunu kullanarak formdan gelen kullanıcı adıyla database query çalıştırılıyor ve first() methodu ile query tamamlanıyor. first() methodu unutulmamalı.
 
  • Gördüğünüz üzere tipler farklı. query tamamlanması için first( ) methodunu da yazacağız.
  • User modele yazdığımız check_password() methodu yardımı ile formdan gelen password bigisini kontrol ediyoruz. username veya password geçersiz ise login ekranına yönlendiriyoruz.
  • login_user() methodu da Flask Login extension'ının bize sağladığı bir method. Aldığı user objesi ile login işlemini tamamlar.
Log-out (Kullanıcı çıkış) işlemi: myapp/routes.py
 
  • Kullanıcılara log-in & log-out linklerini göstermek için, base.html'de düzenleme yapalım.
 
  • Eğer kullanıcı log-in olmamışsa anonymous'tur. Giriş Yap linki görünecektir.

Eğer kullanıcıyı login olmaya mecbur bırakmak istiyorsanız: myapp/__init__.py içerisine şu satırı ekleyin.

 
  • Bu satır ile beraber yetki gerektiren sayfalarda gezinmek için login olmak mecburi hale getirildi.

Belirli sayfalara yetki sınırlaması eklemek istiyorsanız @app.route'dan sonra @login_required decorator ekleyerek, log-in olmayan kullanıcılara sınırlama getirebilirsiniz. myapp/routes.py

 
  • Eğer kullanıcı /index sayfasına istek yaparsa @login_required decorator, URL sonuna bir string ekleyecek. URL : /login?next=%2Findex olacak. next stringi orjinal URL'e ayarlanmıştır. Böylecek kullanıcı log-in olduktan sonra uygulama redirect ederek next'ten sonra gelen sayfaya yönlendirme yapabilir.
 
  • Flask request değişkeni ile istemcinin gönderdiği bütün bilgiyi tutar. request.args dictionary tipinde query string içeriğini barındırır.

  • Login olduktan sonra 3 muhtemel durum var:

    • Eğer login URL next parametresine sahip değilse , kullanıcı index sayfasına yönlendirilir.
    • Eğer login URL next parametresine sahipse, index parametresi de ilgili path'e ayarlanmış(atanmış, belirlenmiş) ise o zaman kullanıcı belirlenmiş URL'e yönlendirilir.
    • Eğer login URL next parametresine sahipse ve tam URL'e(domain name'i içeren) ayarlanmış ise o zaman index sayfasına yönlendirilir.
    • 3.durum (tam domain name'i içeren URL) daha güvenlidir çünkü saldırganlar next parametresine zaafiyetlerinizden yararlanarak başka siteye gidecek şekilde URL ataması yapabilir.
    • absolute URL örneği: <a href="https://adnankayace.blogspot.com">Blog</a>
    • relative URL örneği: <a href="/blog">Blog</a> .
    • URL'imizin absoluterelative mi olup olmadığını tespit etmek için url_parse() kullanıyoruz. Aşağıdaki örnek ile netloc'un (network location part) değerini görebilirsiniz. Bizim örneğimizde de netloc componenti ayarlanmış mı ayarlanmamış mı diye kontrol ediyoruz.
 
  • index.html içinde ufak bir değişiklik yapıp, gerçek kullanıcıları gösterelim artık.
 
  • Ve myapp/routes.py içinde index() metodunu aşağıdaki gibi düzenleyelim. Geçici belirlediğimiz user değişkenini kaldırdık. posts değişkeni de database query'den gelen dataları alıyor.
 

Kullanıcı Kayıt İşlemleri (User Registration)

 
  • validators='teki Email( ) validator sınıfı, email formatında adres girilmesi için eklendi.
  • İki adet parola alıyoruz, bu kullanıcıyı doğru parola girmeye yönlendirmek ve yanlış parola riskini azaltmak içindir. EqualTo() başka bir validator olarak kullanılıyor. İlk parolaya eşit olup olmadığını kontrol eden sınıftır.
  • validate_<field_name> ile WTForms bu methodları özel validator(doğrulayıcı) olarak çağırır.

templates/register.html

 

base.html'de kayıt sayfası için link ekleyelim.

 

myapp/routes.py modülüne de register() methodumuzu yazalım.

 
  • Böylece kullanıcı kaydını da tamamlamış olduk.

register

 

 

 

 

 

Yorumlar