static_authn_plugin/
config.rs1use secrecy::SecretString;
4use serde::Deserialize;
5use uuid::Uuid;
6
7use modkit_security::constants::{DEFAULT_SUBJECT_ID, DEFAULT_TENANT_ID};
8
9#[derive(Debug, Clone, Deserialize)]
11#[serde(default, deny_unknown_fields)]
12pub struct StaticAuthNPluginConfig {
13 pub vendor: String,
15
16 pub priority: i16,
18
19 pub mode: AuthNMode,
21
22 pub default_identity: IdentityConfig,
24
25 pub tokens: Vec<TokenMapping>,
27
28 pub s2s_credentials: Vec<S2sCredentialMapping>,
30}
31
32impl Default for StaticAuthNPluginConfig {
33 fn default() -> Self {
34 Self {
35 vendor: "hyperspot".to_owned(),
36 priority: 100,
37 mode: AuthNMode::AcceptAll,
38 default_identity: IdentityConfig::default(),
39 tokens: Vec::new(),
40 s2s_credentials: Vec::new(),
41 }
42 }
43}
44
45#[derive(Debug, Clone, Deserialize, Default)]
47#[serde(rename_all = "snake_case")]
48pub enum AuthNMode {
49 #[default]
51 AcceptAll,
52 StaticTokens,
54}
55
56#[derive(Debug, Clone, Deserialize)]
58#[serde(default, deny_unknown_fields)]
59pub struct IdentityConfig {
60 pub subject_id: Uuid,
62
63 pub subject_tenant_id: Uuid,
65
66 pub token_scopes: Vec<String>,
68
69 pub subject_type: Option<String>,
73}
74
75impl Default for IdentityConfig {
76 fn default() -> Self {
77 Self {
78 subject_id: DEFAULT_SUBJECT_ID,
79 subject_tenant_id: DEFAULT_TENANT_ID,
80 token_scopes: vec!["*".to_owned()],
81 subject_type: None,
82 }
83 }
84}
85
86#[derive(Debug, Clone, Deserialize)]
88#[serde(deny_unknown_fields)]
89pub struct TokenMapping {
90 pub token: String,
92 pub identity: IdentityConfig,
94}
95
96#[derive(Clone, Deserialize)]
98#[serde(deny_unknown_fields)]
99pub struct S2sCredentialMapping {
100 pub client_id: String,
102 pub client_secret: SecretString,
104 #[serde(default)]
107 pub identity: IdentityConfig,
108}
109
110impl std::fmt::Debug for S2sCredentialMapping {
111 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
112 f.debug_struct("S2sCredentialMapping")
113 .field("client_id", &self.client_id)
114 .field("client_secret", &"[REDACTED]")
115 .field("identity", &self.identity)
116 .finish()
117 }
118}