Rust 将会话信息共享给iron handler
我正在尝试使用Iron实现一个web API,作为一个实践练习。 我的会话是以下结构,它将被编码为JWT。每次我收到客户端的请求时,一些处理程序都需要访问Rust 将会话信息共享给iron handler,rust,iron,Rust,Iron,我正在尝试使用Iron实现一个web API,作为一个实践练习。 我的会话是以下结构,它将被编码为JWT。每次我收到客户端的请求时,一些处理程序都需要访问user_id #[derive(Serialize, Deserialize)] struct Session { session_id: i32, user_id: Option<i32>, expiration: u64, } #[派生(序列化、反序列化)] 结构会话{ 会话id:i32, 用户标识:
user_id
#[derive(Serialize, Deserialize)]
struct Session {
session_id: i32,
user_id: Option<i32>,
expiration: u64,
}
#[派生(序列化、反序列化)]
结构会话{
会话id:i32,
用户标识:选项,
有效期: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())))
}
fn句柄(&self,req:&mut请求)->IronResult{
let session=match get_session(请求){
Err(Err)=>返回Ok(响应::with((状态::BadRequest,Err.description()),
Ok(会话)=>会话,
};
Ok(响应::with((状态::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)
}
}
pub trait SessionHandler{
fn会话管理器(&self)->&SessionManager;
fn认证(&self)->bool{
假的
}
fn handle_session(&self,session:&mut session,req:&mut Request)->IronResult;
fn句柄(&self,请求:&mut请求)->IronResult{
让mut session=match self.session\u manager().get\u request\u session(req){
None=>返回Ok(响应::with((状态::Unauthorized,“”)),
一些(会话)=>{
如果self.authenticated(){
如果let None=session.user\u id{
返回Ok(响应::带有((状态::禁止,“”));
}
}
一场
}
};
self.handle_会话(&mut会话,req)
}
}
发布结构SessionHandlerBox{
酒吧s:T
}
SessionHandlerBox的impl处理程序,其中T:SessionHandler+Send+Sync+'static{
fn handle(&self,r:&mut请求)->ironsult{
自s形手柄(右)
}
}
因此,我使用:
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, "")))
}
}
struct FileDelete{
db:Arc,
sm:Arc,
}
FileDelete的impl SessionHandler{
fn会话管理器(&self)->会话管理器{
self.sm.as_ref()
}
fn handle_session(&self,session:&mut session,req:&mut Request)->IronResult{
Ok(响应::with((状态::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");
}
pub fn register\u处理程序我最终使用了一个包装器:
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)
}
}
pub trait SessionHandler{
fn会话管理器(&self)->&SessionManager;
fn认证(&self)->bool{
假的
}
fn handle_session(&self,session:&mut session,req:&mut Request)->IronResult;
fn句柄(&self,请求:&mut请求)->IronResult{
让mut session=match self.session\u manager().get\u request\u session(req){
None=>返回Ok(响应::with((状态::Unauthorized,“”)),
一些(会话)=>{
如果self.authenticated(){
如果let None=session.user\u id{
返回Ok(响应::带有((状态::禁止,“”));
}
}
一场
}
};
self.handle_会话(&mut会话,req)
}
}
发布结构SessionHandlerBox{
酒吧s:T
}
SessionHandlerBox的impl处理程序,其中T:SessionHandler+Send+Sync+'static{
fn handle(&self,r:&mut请求)->ironsult{
自s形手柄(右)
}
}
因此,我使用:
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, "")))
}
}
struct FileDelete{
db:Arc,
sm:Arc,
}
FileDelete的impl SessionHandler{
fn会话管理器(&self)->会话管理器{
self.sm.as_ref()
}
fn handle_session(&self,session:&mut session,req:&mut Request)->IronResult{
Ok(响应::with((状态::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");
}
pub fn register\u handler目前我是这样解决的:(method FileDelete::handler)(有用的代码)但它看起来太简单了,我不相信这是惯用的,因为我在我的repo中制造了一个问题。所以我会记住这一点。我目前找到了一个详细的解决方案。感谢@Shepmaster的语法更正,我的英语不太流利。我尝试过这一点,但编译器报告:traitfor
没有为file::FileDelete
实现。目前我的解决方法是:(method FileDelete::handler)(有用的代码)但它看起来太简单了,我不认为这是因为我在回购协议中制造了一个问题。所以我会记住这一点。我目前找到了一个详细的解决方案。感谢@Shepmaster的语法更正,我的英语不太流利。我尝试过这一点,但编译器报告:file::FileDelete
的traitfor
没有实现,当前版本可以在存储库中找到当前版本可以在存储库中找到