2022-07-09 19:00:15 +01:00
|
|
|
//! Identity management for Actix Web.
|
2019-03-09 18:04:40 -08:00
|
|
|
//!
|
2022-07-09 19:00:15 +01:00
|
|
|
//! `actix-identity` can be used to track identity of a user across multiple requests. It is built
|
|
|
|
//! on top of HTTP sessions, via [`actix-session`](https://docs.rs/actix-session).
|
2019-03-09 18:04:40 -08:00
|
|
|
//!
|
2022-07-09 19:00:15 +01:00
|
|
|
//! # Getting started
|
|
|
|
//! To start using identity management in your Actix Web application you must register
|
|
|
|
//! [`IdentityMiddleware`] and `SessionMiddleware` as middleware on your `App`:
|
2019-03-09 18:04:40 -08:00
|
|
|
//!
|
2022-07-09 19:00:15 +01:00
|
|
|
//! ```no_run
|
|
|
|
//! # use actix_web::web;
|
|
|
|
//! use actix_web::{cookie::Key, App, HttpServer, HttpResponse};
|
|
|
|
//! use actix_identity::IdentityMiddleware;
|
|
|
|
//! use actix_session::{storage::RedisSessionStore, SessionMiddleware};
|
2019-03-09 18:04:40 -08:00
|
|
|
//!
|
2022-07-09 19:00:15 +01:00
|
|
|
//! #[actix_web::main]
|
|
|
|
//! async fn main() {
|
|
|
|
//! let secret_key = Key::generate();
|
|
|
|
//! let redis_store = RedisSessionStore::new("redis://127.0.0.1:6379")
|
|
|
|
//! .await
|
|
|
|
//! .unwrap();
|
|
|
|
//!
|
|
|
|
//! HttpServer::new(move || {
|
|
|
|
//! App::new()
|
|
|
|
//! // Install the identity framework first.
|
|
|
|
//! .wrap(IdentityMiddleware::default())
|
|
|
|
//! // The identity system is built on top of sessions. You must install the session
|
|
|
|
//! // middleware to leverage `actix-identity`. The session middleware must be mounted
|
|
|
|
//! // AFTER the identity middleware: `actix-web` invokes middleware in the OPPOSITE
|
|
|
|
//! // order of registration when it receives an incoming request.
|
|
|
|
//! .wrap(SessionMiddleware::new(
|
|
|
|
//! redis_store.clone(),
|
|
|
|
//! secret_key.clone()
|
|
|
|
//! ))
|
|
|
|
//! // Your request handlers [...]
|
|
|
|
//! # .default_service(web::to(|| HttpResponse::Ok()))
|
|
|
|
//! })
|
|
|
|
//! # ;
|
|
|
|
//! }
|
2022-03-01 04:23:51 +00:00
|
|
|
//! ```
|
2022-07-09 19:00:15 +01:00
|
|
|
//!
|
|
|
|
//! User identities can be created, accessed and destroyed using the [`Identity`] extractor in your
|
|
|
|
//! request handlers:
|
|
|
|
//!
|
|
|
|
//! ```no_run
|
|
|
|
//! use actix_web::{get, post, HttpResponse, Responder, HttpRequest, HttpMessage};
|
|
|
|
//! use actix_identity::Identity;
|
|
|
|
//! use actix_session::storage::RedisSessionStore;
|
2019-03-09 18:04:40 -08:00
|
|
|
//!
|
2021-03-23 05:05:03 +00:00
|
|
|
//! #[get("/")]
|
2022-07-09 19:00:15 +01:00
|
|
|
//! async fn index(user: Option<Identity>) -> impl Responder {
|
|
|
|
//! if let Some(user) = user {
|
|
|
|
//! format!("Welcome! {}", user.id().unwrap())
|
2019-03-09 18:04:40 -08:00
|
|
|
//! } else {
|
2019-03-09 20:40:09 -08:00
|
|
|
//! "Welcome Anonymous!".to_owned()
|
2019-03-09 18:04:40 -08:00
|
|
|
//! }
|
|
|
|
//! }
|
|
|
|
//!
|
2021-03-23 05:05:03 +00:00
|
|
|
//! #[post("/login")]
|
2022-07-09 19:00:15 +01:00
|
|
|
//! async fn login(request: HttpRequest) -> impl Responder {
|
|
|
|
//! // Some kind of authentication should happen here
|
|
|
|
//! // e.g. password-based, biometric, etc.
|
|
|
|
//! // [...]
|
|
|
|
//!
|
|
|
|
//! // attach a verified user identity to the active session
|
|
|
|
//! Identity::login(&request.extensions(), "User1".into()).unwrap();
|
|
|
|
//!
|
|
|
|
//! HttpResponse::Ok()
|
2019-03-09 18:04:40 -08:00
|
|
|
//! }
|
|
|
|
//!
|
2021-03-23 05:05:03 +00:00
|
|
|
//! #[post("/logout")]
|
2022-07-09 19:00:15 +01:00
|
|
|
//! async fn logout(user: Identity) -> impl Responder {
|
|
|
|
//! user.logout();
|
|
|
|
//! HttpResponse::Ok()
|
2019-03-09 18:04:40 -08:00
|
|
|
//! }
|
2022-07-09 19:00:15 +01:00
|
|
|
//! ```
|
2019-03-09 18:04:40 -08:00
|
|
|
//!
|
2022-07-09 19:00:15 +01:00
|
|
|
//! # Advanced configuration
|
|
|
|
//! By default, `actix-identity` does not automatically log out users. You can change this behaviour
|
|
|
|
//! by customising the configuration for [`IdentityMiddleware`] via [`IdentityMiddleware::builder`].
|
2022-03-01 04:23:51 +00:00
|
|
|
//!
|
2022-07-09 19:00:15 +01:00
|
|
|
//! In particular, you can automatically log out users who:
|
|
|
|
//! - have been inactive for a while (see [`IdentityMiddlewareBuilder::visit_deadline`];
|
|
|
|
//! - logged in too long ago (see [`IdentityMiddlewareBuilder::login_deadline`]).
|
|
|
|
//!
|
|
|
|
//! [`IdentityMiddlewareBuilder::visit_deadline`]: config::IdentityMiddlewareBuilder::visit_deadline
|
|
|
|
//! [`IdentityMiddlewareBuilder::login_deadline`]: config::IdentityMiddlewareBuilder::login_deadline
|
2020-07-06 15:47:22 +09:00
|
|
|
|
2022-07-09 20:05:47 +01:00
|
|
|
#![forbid(unsafe_code)]
|
2022-07-09 19:00:15 +01:00
|
|
|
#![deny(rust_2018_idioms, nonstandard_style, missing_docs)]
|
2021-12-08 06:11:13 +00:00
|
|
|
#![warn(future_incompatible)]
|
2020-07-06 15:47:22 +09:00
|
|
|
|
2022-07-09 19:00:15 +01:00
|
|
|
pub mod config;
|
2021-03-23 05:05:03 +00:00
|
|
|
mod identity;
|
2022-07-09 19:00:15 +01:00
|
|
|
mod identity_ext;
|
2021-03-23 05:05:03 +00:00
|
|
|
mod middleware;
|
2019-03-09 18:04:40 -08:00
|
|
|
|
2021-03-23 05:05:03 +00:00
|
|
|
pub use self::identity::Identity;
|
2022-07-09 19:00:15 +01:00
|
|
|
pub use self::identity_ext::IdentityExt;
|
|
|
|
pub use self::middleware::IdentityMiddleware;
|