use crate::http::security::User;
pub trait ExpressionRoot: Send + Sync {
fn evaluate_function(&self, name: &str, args: &[String], user: Option<&User>) -> Option<bool>;
}
#[derive(Debug, Clone, Default)]
pub struct DefaultExpressionRoot;
impl DefaultExpressionRoot {
pub fn new() -> Self {
DefaultExpressionRoot
}
}
impl ExpressionRoot for DefaultExpressionRoot {
fn evaluate_function(&self, name: &str, args: &[String], user: Option<&User>) -> Option<bool> {
match name {
"hasRole" => {
let role = args.first()?;
Some(user.is_some_and(|u| u.has_role(role)))
}
"hasAnyRole" => {
if args.is_empty() {
return Some(false);
}
Some(user.is_some_and(|u| args.iter().any(|role| u.has_role(role))))
}
"hasAuthority" => {
let authority = args.first()?;
Some(user.is_some_and(|u| u.has_authority(authority)))
}
"hasAnyAuthority" => {
if args.is_empty() {
return Some(false);
}
Some(user.is_some_and(|u| args.iter().any(|auth| u.has_authority(auth))))
}
"isAuthenticated" => Some(user.is_some()),
"isAnonymous" => Some(user.is_none()),
"permitAll" => Some(true),
"denyAll" => Some(false),
_ => None,
}
}
}