Skip to main content

SecurityStack

Struct SecurityStack 

Source
pub struct SecurityStack { /* private fields */ }
Expand description

Composable security middleware stack for Axum.

Holds an optional configuration for each supported layer. Layers set to None are skipped in apply. Start from SecurityStack::default() for safe production defaults, or SecurityStack::new() for the same starting point and chain builder methods to customise or disable individual layers.

§Layer application order

Layers are applied outermost-first in the following order, so each layer’s rejection response is still wrapped by the layers before it (e.g. security headers appear on rate-limit rejections):

helmetredirect_httpsipfilterratelimitbody_limitcsrf → handler

§Examples

use axum::{routing::get, Router};
use rune_axum_stack::SecurityStack;

// Five-layer default stack
let app: Router = SecurityStack::default().apply(
    Router::new().route("/api", get(|| async { "ok" })),
);
use axum::{routing::post, Router};
use rune_axum_stack::SecurityStack;

// REST API: no CSRF, no HTTPS redirect (TLS terminated upstream)
let app: Router = SecurityStack::new()
    .without_csrf()
    .without_redirect_https()
    .apply(Router::new().route("/api/data", post(|| async { "ok" })));

Implementations§

Source§

impl SecurityStack

Source

pub fn new() -> Self

Creates a SecurityStack with the same safe defaults as Default.

§Examples
use axum::{routing::get, Router};
use rune_axum_stack::SecurityStack;

let app: Router = SecurityStack::new()
    .without_csrf()
    .apply(Router::new().route("/", get(|| async { "ok" })));
Source

pub fn helmet(self, config: Helmet) -> Self

Replaces the HelmetLayer configuration.

Source

pub fn without_helmet(self) -> Self

Removes the HelmetLayer from the stack.

Source

pub fn csrf(self, config: CsrfConfig) -> Self

Replaces the CsrfLayer configuration.

Source

pub fn without_csrf(self) -> Self

Removes the CsrfLayer from the stack.

Useful for stateless APIs that authenticate via bearer tokens or API keys where traditional CSRF protection is not applicable.

Source

pub fn ratelimit(self, config: RateLimitConfig) -> Self

Replaces the RateLimitLayer configuration.

Source

pub fn without_ratelimit(self) -> Self

Removes the RateLimitLayer from the stack.

Source

pub fn ipfilter(self, config: IpFilterConfig) -> Self

Enables IP filtering with the given IpFilterConfig.

IP filtering is disabled by default; call this to opt in.

Source

pub fn without_ipfilter(self) -> Self

Removes the IpFilterLayer from the stack (the default state).

Source

pub fn redirect_https(self, config: RedirectHttps) -> Self

Replaces the RedirectHttpsLayer configuration.

Source

pub fn without_redirect_https(self) -> Self

Removes the RedirectHttpsLayer from the stack.

Suitable when TLS is terminated by an upstream proxy that never forwards plain HTTP to the application.

Source

pub fn body_limit(self, config: BodyLimit) -> Self

Replaces the BodyLimitLayer configuration.

Source

pub fn without_body_limit(self) -> Self

Removes the BodyLimitLayer from the stack.

Source

pub fn apply<S>(self, router: Router<S>) -> Router<S>
where S: Clone + Send + Sync + 'static,

Applies all enabled layers to router and returns the wrapped router.

Layers are composed outermost-first: helmetredirect_httpsipfilterratelimitbody_limitcsrf → handler.

§Examples
use axum::{routing::get, Router};
use rune_axum_stack::SecurityStack;

let app: Router = SecurityStack::default().apply(
    Router::new().route("/", get(|| async { "ok" })),
);

Trait Implementations§

Source§

impl Clone for SecurityStack

Source§

fn clone(&self) -> SecurityStack

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SecurityStack

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for SecurityStack

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

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

fn in_current_span(self) -> Instrumented<Self>

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

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

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
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,