use crate::error::Result;
use crate::http::IHttpContext;
use std::collections::HashMap;
pub trait IClaims: Send + Sync {
fn subject(&self) -> &str;
fn roles(&self) -> &[String];
fn permissions(&self) -> &[String];
fn claims(&self) -> &HashMap<String, String>;
fn clone_box(&self) -> Box<dyn IClaims>;
fn has_role(&self, role: &str) -> bool {
self.roles().iter().any(|r| r == role)
}
fn get_userid(&self) -> &str {
self.subject()
}
fn get_username(&self) -> Option<&str> {
self.claims().get("name").map(|s| s.as_str())
}
fn get_tenantid(&self) -> Option<&str> {
self.claims()
.get("tenant_id")
.or_else(|| self.claims().get("tenant"))
.map(|s| s.as_str())
}
}
impl Clone for Box<dyn IClaims> {
fn clone(&self) -> Self {
self.clone_box()
}
}
#[async_trait::async_trait]
pub trait IAuthenticationHandler: Send + Sync {
async fn authenticate(&self, ctx: &mut dyn IHttpContext) -> Result<Option<Box<dyn IClaims>>>;
}
#[async_trait::async_trait]
pub trait IAuthorizationPolicy: Send + Sync {
async fn authorize(&self, claims: &dyn IClaims, resource_key: &str, method: &str)
-> Result<()>;
}
#[async_trait::async_trait]
pub trait IDynamicAuthorizer: Send + Sync {
async fn authorize(
&self,
claims: &dyn IClaims,
route_pattern: &str,
method: &str,
) -> Result<()>;
}