Struct actix_web_grants::GrantsMiddleware[][src]

pub struct GrantsMiddleware<E, Req, Type> where
    for<'a> E: PermissionsExtractor<'a, Req, Type>,
    Type: PartialEq + Clone + 'static, 
{ /* fields omitted */ }
Expand description

Built-in middleware for extracting user permission.

Examples

use actix_web::dev::ServiceRequest;
use actix_web::{get, App, Error, HttpResponse, HttpServer, Responder};

use actix_web_grants::permissions::{AuthDetails, PermissionsCheck};
use actix_web_grants::{proc_macro::has_permissions, 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
// Futhermore, you can use you own type instead of `String` (e.g. Enum).
async fn extract(_req: &ServiceRequest) -> Result<Vec<String>, Error> {
   // Here is a place for your code to get user permissions/grants/permissions from a request
   // For example from a token or database

   // Stub example
   Ok(vec!["ROLE_ADMIN".to_string()])
}

// `has_permissions` is one of options to validate permissions.
// `proc-macro` crate has additional features, like ABAC security and custom types. See examples and `proc-macro` crate docs.
#[get("/admin")]
#[has_permissions("ROLE_ADMIN")]
async fn you_service() -> impl Responder {
    HttpResponse::Ok().finish()
}

Implementations

Create middleware by PermissionsExtractor.

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 PermissionsExtractor
use actix_web::dev::ServiceRequest;
use actix_web::Error;

async fn extract(_req: &ServiceRequest) -> Result<Vec<String>, Error> {
    // Here is a place for your code to get user permissions/grants/permissions from a request
     // For example from a token or database
    Ok(vec!["WRITE_ACCESS".to_string()])
}

// Or with you own type:
#[derive(PartialEq, Clone)] // required bounds
enum Permission { WRITE, READ }
async fn extract_enum(_req: &ServiceRequest) -> Result<Vec<Permission>, Error> {
    // Here is a place for your code to get user permissions/grants/permissions from a request
     // For example from a token, database or external service
    Ok(vec![Permission::WRITE])
}

Trait Implementations

Responses produced by the service.

Errors produced by the service.

The TransformService value created by this factory

Errors produced while building a transform service.

The future response value.

Creates and returns a new Transform component, asynchronously

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Performs the conversion.

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more

Instruments this type with the current Span, returning an Instrumented wrapper. Read more

Performs the conversion.

Should always be Self

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more