当前位置: 首页 > wzjs >正文

电子创意设计网站专业网站是什么

电子创意设计网站,专业网站是什么,某网站注册需要邮箱是怎么弄,廉江网站建设Actix-web 中的权限中间件实现 介绍 在构建 Web 应用时,权限管理是一个关键功能。本文将介绍如何在 Actix-web 中实现一个权限中间件,用于保护路由并确保只有授权用户才能访问特定资源。 权限中间件实现 1. 定义中间件结构体 use actix_web::http::…

Actix-web 中的权限中间件实现

介绍

在构建 Web 应用时,权限管理是一个关键功能。本文将介绍如何在 Actix-web 中实现一个权限中间件,用于保护路由并确保只有授权用户才能访问特定资源。

权限中间件实现

1. 定义中间件结构体

use actix_web::http::header::HeaderMap;
use actix_web::{dev::Service, dev::ServiceRequest, dev::ServiceResponse, Error};
use futures::future::{ready, Ready};
use std::pin::Pin;pub struct Auth;pub struct AuthMiddleware<S> {service: S,
}

2. 实现 Transform Trait

use actix_web::dev::Transform;impl<S, B> Transform<S, ServiceRequest> for Auth
whereS: Service<ServiceRequest, Response = ServiceResponse<B>, Error = Error>,S::Future: 'static,B: 'static,
{type Response = ServiceResponse<B>;type Error = Error;type InitError = ();type Transform = AuthMiddleware<S>;type Future = Ready<Result<Self::Transform, Self::InitError>>;fn new_transform(&self, service: S) -> Self::Future {ready(Ok(AuthMiddleware { service }))}
}

3. 实现 Service Trait

use actix_web::web::Data;
use futures::Future;impl<S, B> Service<ServiceRequest> for AuthMiddleware<S>
whereS: Service<ServiceRequest, Response = ServiceResponse<B>, Error = Error>,S::Future: 'static,B: 'static,
{type Response = ServiceResponse<B>;type Error = Error;type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>>>>;forward_ready!(service);fn call(&self, req: ServiceRequest) -> Self::Future {let path = req.path().to_string();let headers = req.headers().clone();let fut = self.service.call(req);Box::pin(async move {// 定义公共路径(无需授权)let public_paths = vec!["/api/auth/login","/api/auth/register","/api/posts","/api/comments","/api/auth/permissions","/sse/stream","/api/sse/stream",];if public_paths.contains(&path.as_str()) {let res = fut.await?;Ok(res)} else {// 从请求头中提取令牌let token = extract_token(&headers).await;if let Some(token) = token {// 验证令牌let permission_result = has_permission(&token);match permission_result {Ok(_token_data) => {info!("令牌有效");let res = fut.await?;Ok(res)}Err(err) => {error!("解码令牌时发生错误: {:?}", err);let err = AppError::Unauthorized("无效的令牌".to_string());Err(err.into())}}} else {let err = AppError::Unauthorized("令牌未找到".to_string());Err(err.into())}}})}
}

4. 提取令牌工具函数

use actix_web::http::header::HeaderMap;async fn extract_token(headers: &HeaderMap) -> Option<String> {if let Some(authorization_header) = headers.get("Authorization") {if let Ok(authorization_str) = authorization_header.to_str() {// 假设令牌格式为 "Bearer <token>"if let Some(token) = authorization_str.strip_prefix("Bearer ") {return Some(token.to_string());}}}None
}

5. 配置 Actix-web 应用

use actix_web::{web, App, HttpServer};
use actix_cors::Cors;#[actix_web::main]
async fn main() -> std::io::Result<()> {init_logger();let db_pool = create_db_pool().await.unwrap();let app_data = web::Data::new(db_pool);let notifier = web::Data::new(SseNotifier::new());let host = "127.0.0.1";let port = 8080;let server_addr = format!("{}:{}", host, port);log::info!("当前服务成功启动,监听地址为 http://{}", server_addr);HttpServer::new(move || {let cors = Cors::default().allowed_origin("http://127.0.0.1:5502").allowed_methods(vec!["GET", "POST", "PUT", "DELETE", "OPTIONS"]).allowed_headers(vec!["Content-Type", "Authorization", "ACCEPT"]).supports_credentials().max_age(3600);App::new().wrap(actix_web::middleware::Logger::default()).app_data(notifier.clone()).app_data(app_data.clone()).wrap(Auth).wrap(cors).configure(config_routes)}).bind(&server_addr)?.run().await
}

代码说明

  • 中间件定义:定义了一个 Auth 结构体,并实现了 Transform Trait,使其实现中间件功能。
  • 验证逻辑:在中间件的 call 方法中,检查请求路径是否在公共路径列表中。如果不在公共路径列表中,则从请求头中提取令牌并进行验证。
  • 集成到应用:在 Actix-web 应用中,通过 .wrap(Auth) 将权限中间件集成到应用的中间件链中。

结论

通过实现权限中间件,可以有效地保护 Actix-web 应用中的路由,确保只有授权用户才能访问特定资源。这种中间件机制可以灵活地应用于各种需要权限控制的场景。


文章转载自:

http://reZomi4g.hLfsn.cn
http://zytPOqx8.hLfsn.cn
http://cvGGj9eo.hLfsn.cn
http://5FlOYqOB.hLfsn.cn
http://XZcHwDQz.hLfsn.cn
http://Bslk4Vtv.hLfsn.cn
http://etSv82J2.hLfsn.cn
http://mIkLvPpC.hLfsn.cn
http://TsYnyCjJ.hLfsn.cn
http://bzgLSjTP.hLfsn.cn
http://PdAK6Avj.hLfsn.cn
http://zYQylUJt.hLfsn.cn
http://fE37YqQa.hLfsn.cn
http://n0b3LZF4.hLfsn.cn
http://jggYmo1I.hLfsn.cn
http://WB5G084G.hLfsn.cn
http://SURavX58.hLfsn.cn
http://eobZRgal.hLfsn.cn
http://z4WZAWV8.hLfsn.cn
http://ymnQBjjw.hLfsn.cn
http://FGgtDvBH.hLfsn.cn
http://72zYG7oP.hLfsn.cn
http://81dFCteC.hLfsn.cn
http://RvYFdjJH.hLfsn.cn
http://cgViYTBO.hLfsn.cn
http://OeBxm6UZ.hLfsn.cn
http://5pFt2xm8.hLfsn.cn
http://RQOvqwqg.hLfsn.cn
http://95pUAQOa.hLfsn.cn
http://NSdEwBMJ.hLfsn.cn
http://www.dtcms.com/wzjs/699265.html

相关文章:

  • 收录查询工具免费seo技术教程
  • 论吉林省网站职能建设wordpress做成论坛
  • 免费网站注册com天河网站建设多少钱
  • 十堰微网站建设报价矿山建设工程公司网站
  • 青岛建网站多少钱温州网站建站模板
  • 开封网站推广公司做设计的几种网站
  • 专业做国外网站阿里云建设网站能干嘛
  • 网站设计与网页制作项目教程百度高级搜索引擎
  • 新县城乡规划建设局网站企业管理咨询师是干什么的
  • 微网站设计尺寸互联免费虚拟主机
  • 文山网站建设哪家好简述电子商务网站建设的基本流程
  • 民治网站优化培训wordpress不要的代码注释掉
  • 企业网站开发用什么软件福田附件网站建设公司
  • 网站跳出率0网站建设公司宣传册
  • 织梦做的网站怎么上传视频教程牛商网朱依静
  • 网站设计)国家企业信用信息公示网查询
  • 个人英文网站设计开发必备软件
  • 网站项目规划与设计东莞网站设计制作公司
  • 为什么网站不见了wap html网站模板
  • 公司网站重新备案wordpress开启xml rpc
  • 网站建设的市场调研分析个人域名可以做公司网站么
  • 邢台建设专业网站wordpress文章页获取目录名称
  • 织梦可以做视频网站么建设个定制网站需要多少钱
  • 国内优秀企业网站设计做恒指网站
  • 网站开发字体过大盘龙城做网站
  • h5游戏网站建设软件行业未来发展趋势
  • 做内贸要在哪个网站找客户网站 服务报价
  • 阳江网站建设免费下载图片的网站有哪些
  • 重庆建设厂招聘信息网站人工智能就业方向及前景
  • 设计专业招聘网站宿迁市建设局网站