lilydocs
HTTP APIWebSocketConsumer
Güvenlik3 dk okuma

Authentication

Uygulamanızın credential doğrulayıcısını DI, guard ve Principal üzerinden HTTP akışına bağlayın.

Lily; guard, middleware, typed header/cookie ve Principal altyapısını sağlar. Token formatı ve gerçek credential doğrulama implementation’ı uygulamanızın seçimidir. Bu bölüm hazır bir JWT veya OAuth modülü varsaymaz.

Doğrulayıcı sözleşmesi#

Örnekte CredentialVerifier bir uygulama interface’idir. AuthGuard bu interface’i DI’den alır, doğrulamayı bekler ve yalnız başarılı sonuçta principal’ı request’e ekler.

auth.rs
use std::sync::Arc;
use lilyrs::http_api::{
    ExecutionCancellation, Extensions, GuardInitError, GuardRejection,
    GuardTrait, HttpErrorCode, Principal, Request,
};

// Uygulama bu interface için bir Injectable singleton doğrulayıcı sağlar.
#[lilyrs::http_api::async_trait::async_trait]
pub trait CredentialVerifier: Send + Sync {
    async fn verify(
        &self, request: &Request, cancellation: ExecutionCancellation,
    ) -> Result<Principal, GuardRejection>;
}

pub struct AuthGuard { verifier: Arc<dyn CredentialVerifier> }

#[lilyrs::http_api::async_trait::async_trait]
impl GuardTrait for AuthGuard {
    async fn new(extensions: Arc<Extensions>) -> Result<Self, GuardInitError> {
        let verifier = extensions.get_service::<dyn CredentialVerifier>(None).await
            .map_err(|_| GuardInitError::Dependency {
                guard: "AuthGuard", reason: "credential verifier unavailable".into(),
            })?;
        Ok(Self { verifier })
    }

    async fn can_activate(&self, request: &mut Request, cancellation: ExecutionCancellation)
        -> Result<(), GuardRejection>
    {
        let principal = self.verifier.verify(request, cancellation).await?;
        request.set_principal(principal);
        Ok(())
    }
}

pub struct AdminGuard;

#[lilyrs::http_api::async_trait::async_trait]
impl GuardTrait for AdminGuard {
    async fn new(_: Arc<Extensions>) -> Result<Self, GuardInitError> { Ok(Self) }

    async fn can_activate(&self, request: &mut Request, _: ExecutionCancellation)
        -> Result<(), GuardRejection>
    {
        match request.principal() {
            Some(principal) if principal.has_role("admin") => Ok(()),
            Some(_) => Err(GuardRejection::forbidden(
                HttpErrorCode::new("ADMIN_REQUIRED").unwrap(),
            ).unwrap()),
            None => Err(GuardRejection::unauthorized(
                HttpErrorCode::new("AUTH_REQUIRED").unwrap(), "Bearer",
            ).unwrap()),
        }
    }
}

Verifier implementation’ını kaydetme#

Gerçek doğrulayıcı servisinize #[derive(Injectable)] ve #[service(interface = dyn CredentialVerifier, lifetime = "Singleton")] ekleyin; ServiceTrait uygulayın. Bu tipleri mevcut http-api feature’ıyla lilyrs::http_api kökünden alın; DI kurulumu ayrı helper bağımlılığı gerektirmez.

Verifier kendi protokolüne göre credential parsing, imza, issuer, audience, expiry ve gerekiyorsa revoke kontrollerini tamamlar. Başarılı kontrol sonucunda Principal üretir. Bir bearer string’inin bulunması veya decode edilebilmesi tek başına doğrulama değildir.

Endpoint’i koruma#

Controller action’ında #[guard(AuthGuard)] kullanın. Rol kontrolü de gerekiyorsa #[guard(AuthGuard, AdminGuard)] sırasını seçin. Action principal: Principal parametresiyle doğrulanmış kimliğe erişebilir.

AppBuilder::guard(instance) ile hazır guard vermek global koruma başlatmaz. Her korunan action’ın guard kaydı açık olmalıdır.

Hata ve iptal#

Geçersiz veya eksik credential için uygun 401 challenge döndürün. Kimliği doğrulanmış kullanıcının yetkisi yetersizse 403 seçin. Verifier dış bir store veya servise gidiyorsa ExecutionCancellation sinyalini işlem bağlamına iletin.

Bu örnek bir entegrasyon sınırını gösterir. Gerçek verifier kaydı olmadan AuthGuard constructor’ı dependency hatasıyla başlangıcı durdurur.

Bu sayfanın kaynakları v0.1.0

Anlatım, incelenen framework commit’ine dayanır.

HIZLI BAŞLANGIÇ
Dokümantasyon
Kaynak kod