gpt4 book ai didi

rust - 将 session 信息共享给 iron handler

转载 作者:行者123 更新时间:2023-11-29 08:20:57 30 4
gpt4 key购买 nike

我正在尝试使用 Iron 实现 Web API 作为实践练习。我的 session 是以下结构,它将被编码为 JWT。每次我收到来自客户端的请求时,一些处理程序都需要访问 user_id;

#[derive(Serialize, Deserialize)]
struct Session {
session_id: i32,
user_id: Option<i32>,
expiration: u64,
}

有几种方法可以做到这一点,但我不知道最惯用和最不冗长的方法。我在想类似的事情:

fn handle(&self, req: &mut Request) -> IronResult<Response> {
let session = match get_session(req) {
Err(err) => return Ok(Response::with((status::BadRequest, err.description()))),
Ok(session) => session,
};
Ok(Response::with((status::Ok, err.description())))
}

但通过这种方式,我将需要在多个端点上使用此代码段。

我可以使用中间件,但我不知道如何捕获中间件之间的结构值。

最佳答案

我最终使用了包装器:

pub trait SessionHandler {
fn session_manager(&self) -> &SessionManager;
fn authenticated(&self) -> bool {
false
}
fn handle_session(&self, session: &mut Session, req: &mut Request) -> IronResult<Response>;

fn handle(&self, req: &mut Request) -> IronResult<Response> {
let mut session = match self.session_manager().get_request_session(req) {
None => return Ok(Response::with((status::Unauthorized, ""))),
Some(session) => {
if self.authenticated() {
if let None = session.user_id {
return Ok(Response::with((status::Forbidden, "")));
}
}
session
}
};
self.handle_session(&mut session, req)
}
}

pub struct SessionHandlerBox<T> {
pub s: T
}

impl <T> Handler for SessionHandlerBox<T> where T: SessionHandler + Send + Sync + 'static {
fn handle(&self, r: &mut Request) -> IronResult<Response> {
self.s.handle(r)
}
}

所以我使用:

struct FileDelete {
db: Arc<Pool<PostgresConnectionManager>>,
sm: Arc<SessionManager>,
}

impl SessionHandler for FileDelete {
fn session_manager(&self) -> &SessionManager {
self.sm.as_ref()
}
fn handle_session(&self, session: &mut Session, req: &mut Request) -> IronResult<Response> {
Ok(Response::with((status::Ok, "")))
}
}

仍然有样板文件,但“业务逻辑”较少。欢迎任何更好的解决方案。

使用示例:

 pub fn register_handlers<'s>(db: Pool<PostgresConnectionManager>, r: &'s mut Router, sm : Arc<SessionManager>) {
let file_delete = FileDelete { db: Arc::new(db), sm: sm.clone() };
r.delete("/file", SessionHandlerBox {s: file_delete}, "file_delete");
}

关于rust - 将 session 信息共享给 iron handler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47170936/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com