Skip to main content

systemprompt_security/authz/
extension.rs

1//! `Extension` registration for the authz subsystem: schema and migrations.
2//!
3//! Copyright (c) systemprompt.io — Business Source License 1.1.
4//! See <https://systemprompt.io> for licensing details.
5
6use systemprompt_extension::prelude::*;
7
8#[derive(Debug, Clone, Copy, Default)]
9pub struct AuthzExtension;
10
11impl Extension for AuthzExtension {
12    fn metadata(&self) -> ExtensionMetadata {
13        ExtensionMetadata {
14            id: "authz",
15            name: "Authorization",
16            version: env!("CARGO_PKG_VERSION"),
17        }
18    }
19
20    fn is_required(&self) -> bool {
21        true
22    }
23
24    fn schemas(&self) -> Vec<SchemaDefinition> {
25        vec![
26            SchemaDefinition::new(
27                "access_control_entities",
28                include_str!("../../schema/access_control_entities.sql"),
29            )
30            .with_required_columns(vec![
31                "entity_type".into(),
32                "entity_id".into(),
33                "default_included".into(),
34                "source".into(),
35            ]),
36            SchemaDefinition::new(
37                "access_control_rules",
38                include_str!("../../schema/access_control_rules.sql"),
39            )
40            .with_required_columns(vec![
41                "id".into(),
42                "entity_type".into(),
43                "entity_id".into(),
44                "rule_type".into(),
45                "rule_value".into(),
46                "access".into(),
47            ]),
48            SchemaDefinition::new(
49                "governance_decisions",
50                include_str!("../../schema/governance_decisions.sql"),
51            )
52            .with_required_columns(vec![
53                "id".into(),
54                "user_id".into(),
55                "session_id".into(),
56                "tool_name".into(),
57                "decision".into(),
58                "policy".into(),
59                "reason".into(),
60            ]),
61        ]
62    }
63
64    fn dependencies(&self) -> Vec<&'static str> {
65        vec!["users"]
66    }
67
68    fn migrations(&self) -> Vec<Migration> {
69        extension_migrations!()
70    }
71}
72
73register_extension!(AuthzExtension);