use async_trait::async_trait;
use crate::error::SaTokenResult;
#[async_trait]
pub trait PermissionChecker: Send + Sync {
async fn has_permission(&self, login_id: &str, permission: &str) -> SaTokenResult<bool>;
async fn has_all_permissions(&self, login_id: &str, permissions: &[&str]) -> SaTokenResult<bool> {
for permission in permissions {
if !self.has_permission(login_id, permission).await? {
return Ok(false);
}
}
Ok(true)
}
async fn has_any_permission(&self, login_id: &str, permissions: &[&str]) -> SaTokenResult<bool> {
for permission in permissions {
if self.has_permission(login_id, permission).await? {
return Ok(true);
}
}
Ok(false)
}
async fn get_permissions(&self, login_id: &str) -> SaTokenResult<Vec<String>>;
}
#[async_trait]
pub trait RoleChecker: Send + Sync {
async fn has_role(&self, login_id: &str, role: &str) -> SaTokenResult<bool>;
async fn has_all_roles(&self, login_id: &str, roles: &[&str]) -> SaTokenResult<bool> {
for role in roles {
if !self.has_role(login_id, role).await? {
return Ok(false);
}
}
Ok(true)
}
async fn has_any_role(&self, login_id: &str, roles: &[&str]) -> SaTokenResult<bool> {
for role in roles {
if self.has_role(login_id, role).await? {
return Ok(true);
}
}
Ok(false)
}
async fn get_roles(&self, login_id: &str) -> SaTokenResult<Vec<String>>;
}