#session #axum #manager #web-framework #credentials #pool #traits

axum-session-manager

适用于 Rust 网络框架 'Axum' 的会话管理器包

1 个不稳定版本

0.1.1 2024年7月26日
0.1.0 2024年7月26日

#1881 in Web 编程

Download history 219/week @ 2024-07-24 19/week @ 2024-07-31 6/week @ 2024-08-07

每月 244 次下载

MIT 许可证

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