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 = {\