Python’da Kimlik Doğrulama ve Yetkilendirme İşlemleri

Geliştiriciler uygulamalarını oluştururken genellikle bir kullanıcı kimlik doğrulama veya kullanıcı oturumu açma işlevi eklemeleri gerekir. Bu, uygulamanın güvenliğini artırmaya ve belirli kullanıcıların yalnızca belirli verilere erişmesine olanak tanır. Bir uygulama için kimlik doğrulama ve yetkilendirme işlevleri oluşturmak zor bir iş olabilir. Neyse ki bu makalede, bir Python uygulamasında kimlik doğrulama ve yetkilendirme işlemlerini nasıl gerçekleştireceğimizi öğreneceğiz.

Kullanıcı Kimlik Doğrulama ve Yetkilendirme

Hedefimiz, kullanıcıların benzersiz kimlik bilgileri (kullanıcı adı ve şifre) kullanarak uygulamamızda oturum açmasını sağlayan bir API oluşturmak. Aynı zamanda kullanıcıların sistem yöneticileri gibi özel erişim gereksinimleri olan kullanıcılar olup olmadığını belirlemelerine de olanak tanıyacağız.

Kimlik Doğrulaması Nedir?

Kimlik doğrulaması, bir kullanıcının kimliğini doğrulamak ve sistemimize yetkilendirilip yetkilendirilmediğini belirlemek için kimlik bilgilerini (kullanıcı adı ve şifre) kullanma işlemidir. Başka bir deyişle, bir kullanıcının kim olduğunu doğrulamaktır.

Yetkilendirme Nedir?

Yetkilendirme ise kimlik doğrulama sürecinden sonra gelir. Yetkilendirme, kimlikleri doğrulanan kullanıcıların sisteme erişimi olup olmadığını kontrol eder. Başka bir deyişle, sisteme giriş yapan kullanıcının ne tür verilere erişebileceğine karar vermektir.

Kimlik Doğrulama ve Yetkilendirmenin Önemi

Kimlik doğrulama ve yetkilendirme, uygulamamızın güvenliğini artırır. Bu sayede yalnızca yetkili kullanıcıların sistemimize erişmesini sağlar ve verilerimizi güvende tutar.

Kullanıcıların Erişim Gereksinimlerini Belirleme

Her kullanıcıya ayrı ayrı erişim yetkisi verme işlemi oldukça zaman alıcı olabilir. Bu nedenle, sistem yöneticisi gibi yüksek yetkiye sahip kullanıcılar tanımlayıp bu kullanıcıları sisteme eklemek yeterli olacaktır. Diğer kullanıcılar bu yöneticilerin belirlediği yetkilere sahip olacaklardır.

Pylons Kullanarak Kimlik Doğrulama ve Yetkilendirme İşlemleri

Pylons, hızlı bir şekilde web uygulamaları oluşturmak için kullanılan güçlü bir Python çerçevesidir. Bu bölümde, Pylons kullanarak kimlik doğrulama ve yetkilendirme işlemlerini gerçekleştireceğiz.

Kimlik Doğrulama için Gerekli Modüller

Kimlik doğrulama işlemleri için aşağıdaki Python modüllerine ihtiyacımız olacak:

  • sqlalchemy
  • pylons
  • formencode
  • beaker.middleware.session
  • beaker.middleware.sessionfilter
  • cryptacular.bcrypt

Pylons Uygulamamızda Kullanıcı Sınıfını Oluşturma

Pylons uygulamamızda bir User sınıfı oluşturarak kullanıcı bilgilerini bu sınıfta tanımlayacağız. Bu sınıf içinde username, password_hash, is_admin, is_active, created_at ve updated_at gibi değişkenler bulunduracağız. Ayrıca kimlik doğrulama işlemleri için gerekli olan check_password fonksiyonunu da bu sınıfta tanımlayacağız.

# models.py
from sqlalchemy import Boolean, Column, Integer, String  
from sqlalchemy.orm import relationship  
from sqlalchemy.sql import func  
from cryptacular.bcrypt import BCRYPTPasswordManager  
from sqlalchemy.ext.declarative import declared_attr


class User(Base):  
    __tablename__ = "users"  
    username = Column(String(40), unique=True, nullable=False)  
    password_hash = Column(String(128), nullable=False)  
    is_admin = Column(Boolean(), default=False)  
    is_active = Column(Boolean(), default=True)  
    created_at = Column(String(40), default=func.now())  
    updated_at = Column(String(40), default=func.now(), onupdate=func.now())

    @declared_attr.co_varnames[0]  
def __init__(cls, *args, **kwargs):  
        cls.password_manager = BCRYPTPasswordManager()  
        return super().__init__(*args, **kwargs)

    def check_password(self, password):  
        return self.password_manager.check(self.password_hash, password)

BCRYPTPasswordManager(), şifreleri güvenli bir şekilde saklamak için gereken algoritmayı sağlar. check_password fonksiyonu ise girilen şifrenin veritabanındaki şifreyle eşleşip eşleşmediğini kontrol eder.

Kullanıcı Kayıt İşlemi

Kullanıcıların sisteme kaydolabilmesi için bir kayıt formuna ihtiyacımız olacak. Bu formda kullanıcıdan kullanıcı adı ve şifre gibi bilgileri isteyeceğiz. Sistemde aynı adı kullanan başka bir kullanıcı olup olmadığını kontrol edip kullanıcı varsa kaydetmeyecek ve uygun olmayan şifreleri de kabul etmeyeceğiz.

# controllers.py
import re  
from pydantic import BaseModel  
from sqlalchemy.orm import Session


class UserCreate(BaseModel):  
    username: str  
    password: str


def register_user(db: Session, user: UserCreate):  
    # Check if username already exists in the database  
    existing_user = db.query(User).filter(User.username == user.username).first()  
    if existing_user:  
        return None

    # Validate password complexity (length and character types)  
    password_pattern = (  
        r"^(?=.*[A-Za-z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$"  
    )  
    if not re.match(password_pattern, user.password):  
        return None

    hashed_password = User.password_manager.encode(user.password)  
db_user = User(username=user.username, password_hash=hashed_password)  
db.add(db_user)  
db.commit()  
db.refresh(db_user)

return db_user

Kullanıcıdan aldığımız bilgilerle yeni bir User nesnesi oluşturarak sisteme kaydediyoruz. Kullanıcı kaydedilirken şifreyi hash’leyerek veritabanına ekliyoruz.

Kullanıcı Giriş İşlemi

Kullanıcılara sisteme giriş yapabilmeleri için bir giriş formu sunmamız gerekiyor. Kullanıcı adı ve şifre alanları bulunan bu formda istenen bilgilerin doğruluğunu kontrol edip sisteme giriş yapmalarına izin vereceğiz.

# controllers.py
def login_user(db: Session, username: str, password: str):  
    db_user = db.query(User).filter(User.username == username).first()  
    if db_user and db_user.check_password(password):  
        return db_user
    return None

Kullanıcının girdiği bilgilerin veritabanındaki bilgilerle eşleşip eşleşmediğini kontrol ediyoruz. Bilgiler doğruysa kullanıcıyı sisteme giriş yapmasını sağlıyoruz.

Kullanıcı Giriş Kontrolü için Middleware Oluşturma

Kullanıcının sisteme giriş yapıp yapmadığını kontrol eden middleware oluşturmalıyız. Eğer kullanıcı giriş yapmamışsa otomatik olarak giriş sayfasına yönlendirilmelidir.

# middleware.py
def check_authentication():
def wrapper(app):
        # Middleware logic to check user authentication
def inner_wrapper(environ, start_response):
            if "user_id" not in environ:
                # Redirect to login page (e.g., /login)
start_response("302 Found", [("Location", b"/login")])
yield b""
else:
yield from app(environ, start_response)
return inner_wrapper
return wrapper

Kullanıcının oturum açıp açmadığını kontrol eden middleware’imiz bu şekilde tasarlandı. Eğer kullanıcının girişi yoksa giriş sayfasına yönlendiriyoruz.

Kullanıcının Rolüne Göre Yetkilendirme Kontrolü Yapma

Kullanıcının rolünü belirlemek için de middleware oluşturmalıyız. Kullanıcı sisteme giriş yaptığında isminin admin olup olmadığını kontrol edecek olan bu middleware’i de aşağıdaki gibi oluşturuyoruz.

# middleware.py
def check_role(required_role):
def wrapper(app):
def inner_wrapper(environ, start_response):
on_return_value = ...
generate a response based on user role...  
yield response
return inner_wrapper
return wrapper

Kullanıcının Rolünü Kontrol Eden Middleware’in Kullanımı

Kullanıcının rolünü kontrol eden middleware’i Pylons uygulamamızda şu şekilde kullanabiliriz:

# app.py
def init_app(global_conf, full_stack=True, **app_conf):
ap = make_app(global_conf, full_stack=full_stack, **app_conf)
ap.add_middleware(check_authentication())
ap.add_middleware(check_role("admin"))
yield ap

Kullanıcının rolünü kontrol eden middleware’i uygulamamızda şu şekilde kullanarak admin rolüne sahip olmayanların admin sayfasına erişimini engelleyebiliyoruz.

Tam Örnek Uygulama Kodu

Tam örnek uygulama kodunu Github üzerinden şu adresten indirebilirsiniz:

Django Kullanarak Kimlik Doğrulama ve Yetkilendirme İşlemleri

Django da Pylons gibi web uygulamaları geliştirmek için kullanılan popüler bir Python çerçevesidir. Bu bölümde Django kullanarak kimlik doğrulama ve yetkilendirme işlemlerini gerçekleştireceğiz.

Django Projesini Oluşturma ve Gerekli Modüllerin Yüklenmesi

Django projemizi oluşturmak için terminalde şu komutu çalıştırıyoruz:

django-admin startproject myproject

Daha sonra projemizin klasörüne geçiyoruz:

cd myproject/

Django projemizi oluşturduktan sonra gerekli modülleri yüklemek için şu komutu çalıştırıyoruz:

pip install django djangorestframework djangorestframework-simplejwt

Django projemizi oluşturduktan ve gerekli modülleri yükledikten sonra projemizi şu şekilde yapılandırıyoruz:

# myproject/settings.py
INSTALLED_APPS = [
django.contrib.admin,
django.contrib.auth,
django.contrib.contenttypes,
django.contrib.sessions,
django.contrib.messages,
django.contrib.staticfiles,
django.contrib.sites,
django.contrib.sitemaps,
django_filters,
drest_framework,
drest_framework_simplejwt.token_blacklist,
mypage,
d]
simplejwt_token_timeout = timedelta(days=5)
djangorestframework_simplejwt.authentication.JWTAuthentication,
default_auto_field = "django.db.models.BigAutoField"
swagger_url = "swagger/"
schema_url_patterns = [path("swagger-ui/", get_schema_view(title="My Project API", public=True)),]
auth_token_expiry_days = timedelta(days=5)
swagger_settings = {\

Scroll to Top