1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//! # Chronix Authz — Cedar-based Authorization
//!
//! Fine-grained authorization for the Chronix time-series database using
//! the [Cedar](https://www.cedarpolicy.com/) policy language (formally
//! verified, pure Rust).
//!
//! ## Architecture
//!
//! ```text
//! Request → AuthMiddleware → AuthContext
//! │
//! ▼
//! AuthzEngine (Cedar)
//! ├── PolicySet (hot-reloadable)
//! ├── Entities (principal, resource, roles)
//! └── Decision: Allow | Deny { reasons }
//! ```
//!
//! ## Policy Model
//!
//! - **Principals:** `Chronix::User` with role membership via `Chronix::Role`
//! - **Actions:** `Chronix::Action::{ Write, Read, Delete, Admin, ... }`
//! - **Resources:** `Chronix::Measurement` with name and optional tags
//!
//! ## Default-Deny
//!
//! If no policy explicitly permits a request, it is denied. Use `forbid`
//! policies to create hard denials that override permissive policies.
//!
//! ## Example
//!
//! ```no_run
//! use chronix_security::authz::{AuthzEngine, ChronixAction, ChronixPrincipal, ChronixResource};
//!
//! let engine = AuthzEngine::new();
//! engine.load_policies(r#"
//! permit(
//! principal in Chronix::Role::"admin",
//! action,
//! resource
//! );
//! "#).unwrap();
//!
//! let admin = ChronixPrincipal::new("alice").with_role("admin");
//! let resource = ChronixResource::measurement("cpu");
//! let decision = engine.authorize(&admin, ChronixAction::Write, &resource);
//! assert!(decision.is_allowed());
//! ```
pub use ;
pub use AuthzError;
pub use ;