Guard’lar
Action çalışmadan önce kimlik, yetki veya kota koşullarını kontrol edin.
Guard, bir action’ın çalışmasına izin verilip verilmeyeceğine karar verir. Constructor new(Arc<Extensions>), karar method’u can_activate(&self, &mut Request, ExecutionCancellation) şeklindedir.
Rol kontrolü örneği#
Aşağıdaki guard doğrulanmış principal’da admin rolünü arar. Kimliği doğrulama görevi AuthGuard tarafından önce tamamlanmalıdır.
use std::sync::Arc;
use lilyrs::http_api::{
ExecutionCancellation, Extensions, GuardInitError, GuardRejection,
GuardTrait, HttpErrorCode, Principal, Request,
};
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()),
}
}
}
Action’a bağlama#
#[get("/admin")]
#[guard(AuthGuard, AdminGuard)]Bu attribute’ları controller action’ına ekleyin. Guard’lar soldan sağa çalışır. Önce AuthGuard principal’ı yayımlar, sonra AdminGuard rolünü kontrol eder.
Instance sağlama#
AppBuilder::guard(instance) belirli bir türün hazır instance’ını verir. Bu çağrı tek başına bütün endpoint’lerde guard çalıştırmaz. İlgili action’da #[guard(Type)] yine gereklidir. Aynı prebuilt tür tekrar verilirse son instance kullanılır; CsrfGuard bu yoldan verilemez.
Ret sözleşmesi#
GuardRejection, ortak HttpRejection yapısını kullanır. 401 challenge, 403, 429 / Retry-After, 503, sınırlandırılmış problem detail ve JSON/text yanıt destekler. Beklenen erişim reddini teknik runtime hatasıyla karıştırmayın.
Bu sayfanın kaynakları v0.1.0
Anlatım, incelenen framework commit’ine dayanır.