chimes_auth/chimes.rs
1
2use std::{iter::Map};
3use futures::Future;
4use serde::de::DeserializeOwned;
5
6pub trait ChimesResource<T>
7 where
8 T: Sized
9 {
10 /**
11 * 获取资源的编码
12 */
13 fn get_code(&self) -> String;
14
15 /**
16 * 加载所有的资源
17 */
18 fn load_all_resources(&self) -> Map<String, T>;
19 }
20
21 pub trait ChimesAuthUser<T: Sized + DeserializeOwned> {
22
23 /**
24 * Chimes用户名
25 */
26 fn get_user_name(&self) -> String;
27
28 /**
29 * Chimes验证信息,如密码
30 */
31 fn get_creditial(&self) -> String;
32
33 /**
34 * 转换到T,这个用户的真实信息
35 */
36 fn to_detail(self) -> T;
37 }
38
39 pub trait ChimesAuthService<T>
40 where
41 T: Clone + Sized + ChimesAuthUser<T> + DeserializeOwned
42 {
43 type Future: Future<Output = Option<T>>;
44 /**
45 * 检查用户是否能够通过指定的URL
46 * 根据系统的配置来确定是否能够通过这个URL请求
47 * 1. ust为None值
48 * 此时根据req_method和url_pattern查询到该url为bypass=anonymous的模式,则返回Some(Default)
49 * 此时根据req_method和url_pattern查询到该url为bypass=user的模式,则返回None
50 * 此时根据req_method和url_pattern查询到该url为bypass=permit的模式,则返回None
51 * 2. ust为Some值
52 * 此时根据req_method和url_pattern查询到该url为bypass=anonymous的模式,则返回true
53 * 此时根据req_method和url_pattern查询到该url为bypass=user的模式,则返回true
54 * 此时根据req_method和url_pattern查询到该url为bypass=permit的模式,则:
55 * a. 用户拥有可以访问该权限的角色:返回Some(T)
56 * b. 用户拥有可以访问该权限的资源: 返回Some(T)
57 * c. 用户不满足a和b,则返回None
58 */
59 fn permit(&self, ust: &Option<T>, req_method: &String, url_pattern: &String) -> Self::Future;
60
61
62 /**
63 * 检查Authentication信息是否为有效的用户信息
64 * 可以做如下处理
65 * 1. token是一个唯一的字符串信息,通过以该token为key,从存储(数据库或Redis或内存)中查询到该Key所代表的用户信息;
66 * 2. token是一个JWT Token,则解析该Token以获得登录的用户名等信息
67 * 3. 再通过用户信息去查询用户详细信息
68 * 4. 返回None表示该token已失效,返回Some表示该Token有效,且可以找到对应的帐户信息
69 */
70 fn authenticate(&self, token: &String) -> Self::Future;
71
72
73 /**
74 * 检查Non-JWT Header信息是否为有效的用户信息
75 * 在使用特定的Header作为API请求时,可以使用该Header
76 * 可以做如下处理
77 * 1. token是一个唯一的字符串信息,通过以该token为key,从存储(数据库或Redis或内存)中查询到该Key所代表的用户信息;
78 * 2. token是一个NON-JWT Token,则解析该Token以获得登录的用户名等信息
79 * 3. 再通过用户信息去查询用户详细信息
80 * 4. 返回None表示该token已失效,返回Some表示该Token有效,且可以找到对应的帐户信息
81 */
82 fn nojwt_authenticate(&self, token: &String) -> Self::Future;
83}
84