use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuthClaims {
pub sub: String,
#[serde(default)]
pub roles: Vec<String>,
pub exp: u64,
#[serde(default)]
pub iss: Option<String>,
#[serde(default)]
pub aud: Option<String>,
}
impl AuthClaims {
pub fn new(sub: impl Into<String>, roles: Vec<String>, ttl_secs: u64) -> Self {
let exp = jsonwebtoken::get_current_timestamp().saturating_add(ttl_secs);
Self {
sub: sub.into(),
roles,
exp,
iss: None,
aud: None,
}
}
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))
}
}