alun_web/middleware/
mod.rs1pub mod request_id;
18pub mod auth;
19pub mod role;
20pub mod permission;
21pub mod permission_check;
22pub mod request_log;
23pub mod rate_limit;
24pub mod security_headers;
25#[cfg(feature = "cache")]
26pub mod nonce;
27#[cfg(feature = "cache")]
28pub mod idempotency;
29
30pub use request_id::{RequestIdLayer, RequestIdService};
31pub use auth::{AuthLayer, AuthService};
32pub use role::{RequireRoleLayer, RequireRoleService};
33pub use permission::{RequirePermissionLayer, RequirePermissionService};
34pub use permission_check::{PermissionCheckLayer, PermissionRule, PermissionCheckService};
35pub use request_log::{RequestLogLayer, RequestLogService};
36pub use rate_limit::{RateLimitLayer, IpWindow, RateLimitService};
37pub use security_headers::{SecurityHeadersLayer, SecurityHeadersService};
38#[cfg(feature = "cache")]
39pub use nonce::{NonceLayer, NonceService};
40#[cfg(feature = "cache")]
41pub use idempotency::{IdempotencyLayer, IdempotencyService};
42
43#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
45pub enum TokenType {
46 #[serde(rename = "access")]
48 Access,
49 #[serde(rename = "refresh")]
51 Refresh,
52}
53
54#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
59pub struct TokenClaims {
60 #[serde(default)]
62 pub jti: Option<String>,
63 pub sub: String,
65 #[serde(default, skip_serializing_if = "Option::is_none")]
67 pub username: Option<String>,
68 #[serde(default, skip_serializing_if = "Vec::is_empty")]
70 pub roles: Vec<String>,
71 #[serde(default, skip_serializing_if = "Vec::is_empty")]
73 pub permissions: Vec<String>,
74 #[serde(default)]
76 pub token_type: Option<TokenType>,
77 pub exp: usize,
79 #[serde(default)]
81 pub iat: usize,
82}
83
84impl TokenClaims {
85 pub fn user_id(&self) -> &str {
87 &self.sub
88 }
89
90 pub fn has_role(&self, role: &str) -> bool {
92 self.roles.iter().any(|r| r == role)
93 }
94
95 pub fn has_any_role(&self, roles: &[&str]) -> bool {
97 roles.iter().any(|r| self.has_role(r))
98 }
99
100 pub fn has_all_roles(&self, roles: &[&str]) -> bool {
102 roles.iter().all(|r| self.has_role(r))
103 }
104
105 pub fn has_permission(&self, permission: &str) -> bool {
109 self.is_super_admin() || self.permissions.iter().any(|p| p == permission)
110 }
111
112 pub fn has_any_permission(&self, permissions: &[&str]) -> bool {
114 self.is_super_admin() || permissions.iter().any(|p| self.has_permission(p))
115 }
116
117 pub fn is_super_admin(&self) -> bool {
119 self.permissions.iter().any(|p| p == "*" || p == "*:*:*")
120 }
121}
122
123#[derive(Clone, Debug)]
125pub struct UserId(pub String);
126
127#[derive(Clone, Debug)]
129pub struct AuthClaims(pub TokenClaims);