pub mod request_id;
pub mod auth;
pub mod role;
pub mod permission;
pub mod permission_check;
pub mod request_log;
pub mod rate_limit;
pub mod security_headers;
#[cfg(feature = "cache")]
pub mod nonce;
#[cfg(feature = "cache")]
pub mod idempotency;
pub use request_id::{RequestIdLayer, RequestIdService};
pub use auth::{AuthLayer, AuthService};
pub use role::{RequireRoleLayer, RequireRoleService};
pub use permission::{RequirePermissionLayer, RequirePermissionService};
pub use permission_check::{PermissionCheckLayer, PermissionRule, PermissionCheckService};
pub use request_log::{RequestLogLayer, RequestLogService};
pub use rate_limit::{RateLimitLayer, IpWindow, RateLimitService};
pub use security_headers::{SecurityHeadersLayer, SecurityHeadersService};
#[cfg(feature = "cache")]
pub use nonce::{NonceLayer, NonceService};
#[cfg(feature = "cache")]
pub use idempotency::{IdempotencyLayer, IdempotencyService};
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum TokenType {
#[serde(rename = "access")]
Access,
#[serde(rename = "refresh")]
Refresh,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct TokenClaims {
#[serde(default)]
pub jti: Option<String>,
pub sub: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub username: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub roles: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub permissions: Vec<String>,
#[serde(default)]
pub token_type: Option<TokenType>,
pub exp: usize,
#[serde(default)]
pub iat: usize,
}
impl TokenClaims {
pub fn user_id(&self) -> &str {
&self.sub
}
pub fn has_role(&self, role: &str) -> bool {
self.roles.iter().any(|r| r == role)
}
pub fn has_any_role(&self, roles: &[&str]) -> bool {
roles.iter().any(|r| self.has_role(r))
}
pub fn has_all_roles(&self, roles: &[&str]) -> bool {
roles.iter().all(|r| self.has_role(r))
}
pub fn has_permission(&self, permission: &str) -> bool {
self.is_super_admin() || self.permissions.iter().any(|p| p == permission)
}
pub fn has_any_permission(&self, permissions: &[&str]) -> bool {
self.is_super_admin() || permissions.iter().any(|p| self.has_permission(p))
}
pub fn is_super_admin(&self) -> bool {
self.permissions.iter().any(|p| p == "*" || p == "*:*:*")
}
}
#[derive(Clone, Debug)]
pub struct UserId(pub String);
#[derive(Clone, Debug)]
pub struct AuthClaims(pub TokenClaims);