Struct actix_web_grants::GrantsMiddleware
source · pub struct GrantsMiddleware<E, Req, Type>{ /* private fields */ }
Expand description
Built-in middleware for extracting user authorities.
§Examples
use actix_web::dev::ServiceRequest;
use actix_web::{get, App, Error, HttpResponse, HttpServer, Responder};
use std::collections::HashSet;
use actix_web_grants::authorities::{AuthDetails, AuthoritiesCheck};
use actix_web_grants::{protect, GrantsMiddleware};
fn main() {
HttpServer::new(|| {
let auth = GrantsMiddleware::with_extractor(extract);
App::new()
.wrap(auth)
.service(you_service)
});
}
// You can use both &ServiceRequest and &mut ServiceRequest
// Furthermore, you can use you own type instead of `String` (e.g. Enum).
async fn extract(_req: &ServiceRequest) -> Result<HashSet<String>, Error> {
// Here is a place for your code to get user permissions/roles/authorities from a request
// For example from a token or database
// Stub example
Ok(HashSet::from(["ROLE_ADMIN".to_string()]))
}
// `proc-macro` crate has additional features, like ABAC security and custom types. See examples and `proc-macro` crate docs.
#[get("/admin")]
#[protect("ROLE_ADMIN")]
async fn you_service() -> impl Responder {
HttpResponse::Ok().finish()
}
Implementations§
source§impl<E, Req, Type> GrantsMiddleware<E, Req, Type>
impl<E, Req, Type> GrantsMiddleware<E, Req, Type>
sourcepub fn with_extractor(extractor: E) -> GrantsMiddleware<E, Req, Type>
pub fn with_extractor(extractor: E) -> GrantsMiddleware<E, Req, Type>
Create middleware by AuthoritiesExtractor
.
You can use a built-in implementation for async fn
with a suitable signature (see example below).
Or you can define your own implementation of trait.
§Example of function with implementation of AuthoritiesExtractor
use actix_web::dev::ServiceRequest;
use actix_web::Error;
use std::collections::HashSet;
async fn extract(_req: &ServiceRequest) -> Result<HashSet<String>, Error> {
// Here is a place for your code to get user permissions/roles/authorities from a request
// For example from a token or database
Ok(HashSet::from(["WRITE_ACCESS".to_string()]))
}
// Or with you own type:
#[derive(Eq, PartialEq, Hash)] // required bounds
enum Permission { WRITE, READ }
async fn extract_enum(_req: &ServiceRequest) -> Result<HashSet<Permission>, Error> {
// Here is a place for your code to get user permissions/roles/authorities from a request
// For example from a token, database or external service
Ok(HashSet::from([Permission::WRITE]))
}
Trait Implementations§
source§impl<S, B, E, Req, Type> Transform<S, ServiceRequest> for GrantsMiddleware<E, Req, Type>where
S: Service<ServiceRequest, Response = ServiceResponse<B>, Error = Error> + 'static,
for<'a> E: AuthoritiesExtractor<'a, Req, Type> + 'static,
Type: Eq + Hash + 'static,
impl<S, B, E, Req, Type> Transform<S, ServiceRequest> for GrantsMiddleware<E, Req, Type>where
S: Service<ServiceRequest, Response = ServiceResponse<B>, Error = Error> + 'static,
for<'a> E: AuthoritiesExtractor<'a, Req, Type> + 'static,
Type: Eq + Hash + 'static,
§type Response = ServiceResponse<EitherBody<B>>
type Response = ServiceResponse<EitherBody<B>>
Responses produced by the service.
§type Future = Ready<Result<<GrantsMiddleware<E, Req, Type> as Transform<S, ServiceRequest>>::Transform, <GrantsMiddleware<E, Req, Type> as Transform<S, ServiceRequest>>::InitError>>
type Future = Ready<Result<<GrantsMiddleware<E, Req, Type> as Transform<S, ServiceRequest>>::Transform, <GrantsMiddleware<E, Req, Type> as Transform<S, ServiceRequest>>::InitError>>
The future response value.
source§fn new_transform(&self, service: S) -> Self::Future
fn new_transform(&self, service: S) -> Self::Future
Creates and returns a new Transform component, asynchronously
Auto Trait Implementations§
impl<E, Req, Type> Freeze for GrantsMiddleware<E, Req, Type>
impl<E, Req, Type> RefUnwindSafe for GrantsMiddleware<E, Req, Type>
impl<E, Req, Type> !Send for GrantsMiddleware<E, Req, Type>
impl<E, Req, Type> !Sync for GrantsMiddleware<E, Req, Type>
impl<E, Req, Type> Unpin for GrantsMiddleware<E, Req, Type>
impl<E, Req, Type> UnwindSafe for GrantsMiddleware<E, Req, Type>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more