Skip to main content

sz_orm_auth/
lib.rs

1//! # SZ-ORM Auth — 认证授权
2//!
3//! 提供 JWT 令牌签发/校验与基于 RBAC 的权限控制(`Authorizer`/`RbacAuthorizer`),
4//! 涵盖用户、凭证与角色权限模型。
5//!
6//! ## 主要模块
7//!
8//! - [`auth`] — 用户、凭证等基础模型
9//! - [`jwt`] — JSON Web Token 签发与校验
10//! - [`authorizer`] — RBAC 授权器
11
12pub mod auth;
13pub mod authorizer;
14pub mod error;
15pub mod jwt;
16
17pub use auth::*;
18pub use authorizer::{Authorizer, RbacAuthorizer};
19pub use error::AuthError;
20
21#[cfg(test)]
22mod tests {
23    use super::*;
24
25    #[test]
26    fn test_module_exports() {
27        // Smoke test ensuring the public API compiles and is reachable.
28        let creds = Credentials::new("user", "pass");
29        assert_eq!(creds.username, "user");
30    }
31
32    #[test]
33    fn test_rbac_authorizer_via_lib_root() {
34        let authorizer = RbacAuthorizer::new();
35        let user = User::new(1, "user").with_permissions(vec!["read".to_string()]);
36
37        let can_read = authorizer.can(&user, "read", "resource");
38        let can_delete = authorizer.can(&user, "delete", "resource");
39
40        assert!(can_read.unwrap());
41        assert!(!can_delete.unwrap());
42    }
43
44    #[test]
45    fn test_rbac_authorizer_admin_via_lib_root() {
46        let authorizer = RbacAuthorizer::new();
47        let user = User::new(1, "admin").with_roles(vec!["admin".to_string()]);
48
49        let can_do_anything = authorizer.can(&user, "delete", "anything");
50
51        assert!(can_do_anything.unwrap());
52    }
53
54    #[test]
55    fn test_jwt_authenticator_via_lib_root() {
56        let auth = JwtAuthenticator::new("secret", "issuer", 3600);
57        let creds = Credentials::new("user", "pass");
58
59        let token = auth.authenticate(&creds).expect("authenticate");
60        assert!(!token.access_token.is_empty());
61
62        let user = auth.verify_token(&token.access_token).expect("verify");
63        assert_eq!(user.username, "user");
64    }
65
66    #[test]
67    fn test_jwt_encoder_via_lib_root() {
68        use jwt::{JwtClaims, JwtEncoder};
69        let encoder = JwtEncoder::new("lib-secret");
70        let claims = JwtClaims::new("lib-user", 9_999_999_999);
71        let token = encoder.encode(&claims).expect("encode");
72        let decoded = encoder.decode(&token).expect("decode");
73        assert_eq!(decoded.sub, "lib-user");
74    }
75}