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