Struct actix_web_grants::GrantsMiddleware
source · [−]pub struct GrantsMiddleware<E, Req, Type> where
for<'a> E: PermissionsExtractor<'a, Req, Type>,
Type: PartialEq + Clone + 'static, { /* private fields */ }
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
sourceimpl<E, Req, Type> GrantsMiddleware<E, Req, Type> where
for<'a> E: PermissionsExtractor<'a, Req, Type>,
Type: PartialEq + Clone + 'static,
impl<E, Req, Type> GrantsMiddleware<E, Req, Type> where
for<'a> E: PermissionsExtractor<'a, Req, Type>,
Type: PartialEq + Clone + 'static,
sourcepub fn with_extractor(extractor: E) -> GrantsMiddleware<E, Req, Type>
pub fn with_extractor(extractor: E) -> GrantsMiddleware<E, Req, Type>
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
sourceimpl<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: PermissionsExtractor<'a, Req, Type> + 'static,
Type: PartialEq + Clone + '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: PermissionsExtractor<'a, Req, Type> + 'static,
Type: PartialEq + Clone + 'static,
type Response = ServiceResponse<B>
type Response = ServiceResponse<B>
Responses produced by the service.
type Transform = GrantsService<S, E, Req, Type>
type Transform = GrantsService<S, E, Req, Type>
The TransformService
value created by this factory
sourcefn 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> RefUnwindSafe for GrantsMiddleware<E, Req, Type> where
E: RefUnwindSafe,
Req: RefUnwindSafe,
Type: RefUnwindSafe,
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> where
Req: Unpin,
Type: Unpin,
impl<E, Req, Type> UnwindSafe for GrantsMiddleware<E, Req, Type> where
E: RefUnwindSafe,
Req: UnwindSafe,
Type: UnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
sourceimpl<T> Instrument for T
impl<T> Instrument for T
sourcefn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
sourcefn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
fn vzip(self) -> V
sourceimpl<T> WithSubscriber for T
impl<T> WithSubscriber for T
sourcefn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
Attaches the provided Subscriber
to this type, returning a
WithDispatch
wrapper. Read more
sourcefn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Attaches the current default Subscriber
to this type, returning a
WithDispatch
wrapper. Read more