1 个不稳定版本
0.1.1 | 2024年7月26日 |
---|---|
0.1.0 |
|
#1881 in Web 编程
每月 244 次下载
21KB
391 行
axum-session-manager
axum 的会话管理器包。
可以作为认证的一部分使用。
安装
[dependencies]
axum-session-manager = "*"
用法
只需为您的数据库池或由结构体包装的内存实现 SessionManage
特性,您就可以使用会话管理系统。
#[derive(Debug, Clone)]
struct Credential {
id: i32,
name: String,
password: String,
}
#[derive(Debug, Clone)]
struct SessionPool {
pool: Arc<RwLock<HashMap<String, Credential>>>,
}
impl SessionPool {
fn new() -> Self {
Self {
pool: Arc::default(),
}
}
}
#[derive(Debug, Clone, Error)]
enum ServerError {
#[error("unexpected error")]
Unexpect,
}
#[async_trait]
impl SessionManage<Credential> for SessionPool {
type SessionID = String;
type UserInfo = Credential;
type Error = ServerError;
async fn add_session(&self, session_data: Credential) -> Result<Self::SessionID, Self::Error> {
// insert session-id and user-data logic here
}
async fn verify_session(
&self,
session_id: &str,
) -> Result<Option<Self::UserInfo>, Self::Error> {
// query session logic here
}
async fn delete_session(&self, session_id: &str) {
// delete session logic here
}
}
在 axum::handler 中获取会话数据(用户数据)的方法是使用 axum::Extension<T>
async fn handler(Extension(user_data): Extension<UserData<Credential>>) -> impl IntoResponse {
let try_session = user_data.0;
match try_session {
UserState::HaveSession(a) => {
// do some task by using user-data
}
UserState::NoCookie => {
// response StatusCode::Unauthorized
}
UserState::NoSession => {
// response StatusCode::Unauthorized
}
}
请参阅示例以获取更多信息。
依赖项
~5.5MB
~98K SLoC