pub trait AuthenticationHandler {
fn authentication(&self) -> Option<AuthenticationData>;
fn set_authentication(&self, authentication: Option<&AuthenticationData>);
}
Accessing Request Authentication Information
The Authentication
injectable provides an interface to:
-
Propagate authentication data for consumption by other policies.
-
Consume authentication data already set by another policy.
To share data, Authentication
implements the AuthenticationHandler
trait:
The AuthenticationData
struct contains the following authentication data:
pub struct AuthenticationData {
pub principal: Option<String>,
pub client_id: Option<String>,
pub client_name: Option<String>,
pub properties: Value,
}
For example, the following code reads the Authentication
data and modifies it by overriding the client_id
and client_name
:
async fn request_filter(state: RequestState, authentication: Authentication) -> Flow<()> {
let state = state.into_headers_state().await;
let header_handler = state.handler();
let auth = authentication.authentication().unwrap_or_default();
let properties = auth.properties.as_object().cloned().unwrap_or_default();
let client_id = header_handler
.header("custom_client_id_header")
.unwrap_or_default();
let client_name = header_handler
.header("custom_client_name_header")
.unwrap_or_default();
let auth = AuthenticationData::new(
auth.principal,
Some(client_id),
Some(client_name),
properties
);
authentication.set_authentication(Some(&auth));
Flow::Continue(())
}
#[entrypoint]
async fn configure(launcher: Launcher) -> Result<()> {
let filter = on_request(|rs, auth| request_filter(rs, auth));
launcher.launch(filter).await?;
Ok(())
}