#![warn(missing_docs)]
pub mod checker;
pub mod engine;
pub mod matcher;
pub mod middleware;
pub use checker::Checker;
pub use engine::{
AttributeSource, Attributes, Condition, Decision, Effect, Engine, Operator, Permission, Policy,
Request, Resource, Role, Subject,
};
pub use matcher::{match_any, match_pattern};
pub use middleware::{AuthorizationLayer, AuthorizationService, RequestAuthorizer};
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[non_exhaustive]
pub enum AuthzDecision {
Allow,
Deny(String),
RequiresHumanApproval(String),
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct AuthzRequest {
pub principal: String,
pub action: String,
pub resource: String,
#[serde(default)]
pub scopes: Vec<String>,
#[serde(default)]
pub attributes: serde_json::Value,
}
pub trait Decider: Send + Sync {
fn decide(&self, request: &AuthzRequest) -> AuthzDecision;
}