AuthSession in progress
This commit is contained in:
parent
1644c9c51c
commit
56ef6e3df9
|
|
@ -1,9 +1,15 @@
|
||||||
|
pub mod db;
|
||||||
|
|
||||||
use axum::{
|
use axum::{
|
||||||
Router,
|
Router,
|
||||||
routing::{get, post}
|
routing::{get, post}
|
||||||
};
|
};
|
||||||
|
use axum_session_auth::AuthSession;
|
||||||
|
use axum_session_mongo::SessionMongoPool;
|
||||||
|
use db::User;
|
||||||
|
use http::method::Method;
|
||||||
|
use mongodb::{Client, bson::oid::ObjectId};
|
||||||
|
|
||||||
mod db;
|
|
||||||
|
|
||||||
pub fn router() -> Router {
|
pub fn router() -> Router {
|
||||||
Router::new()
|
Router::new()
|
||||||
|
|
@ -35,3 +41,7 @@ pub async fn post_sign_up() {}
|
||||||
pub async fn post_backup() {}
|
pub async fn post_backup() {}
|
||||||
|
|
||||||
pub async fn get_restore() {}
|
pub async fn get_restore() {}
|
||||||
|
|
||||||
|
async fn auth(method: Method, auth: AuthSession<User, ObjectId, SessionMongoPool, Client>) {
|
||||||
|
//TODO: Auth loop (get from crate example)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,12 @@
|
||||||
|
use anyhow::Result;
|
||||||
|
use axum::async_trait;
|
||||||
|
use axum_session_auth::Authentication;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use mongodb::{
|
use mongodb::{
|
||||||
bson::{DateTime, oid::ObjectId},
|
bson::{doc, oid::ObjectId, DateTime},
|
||||||
Client,
|
Client,
|
||||||
Database,
|
|
||||||
error::Error,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
pub async fn get_database_client() -> Result<Database, Error> {
|
|
||||||
Ok(Client::with_uri_str("mongodb:://localhost:27017").await?.database("dermy"))
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
pub struct Mole {
|
pub struct Mole {
|
||||||
#[serde(rename = "_id", skip_serializing_if = "Option::is_none")]
|
#[serde(rename = "_id", skip_serializing_if = "Option::is_none")]
|
||||||
|
|
@ -87,26 +84,51 @@ impl LogEntry {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Clone, Serialize, Deserialize)]
|
||||||
pub struct User {
|
pub struct User {
|
||||||
#[serde(rename = "_id", skip_serializing_if = "Option::is_none")]
|
#[serde(rename = "_id", skip_serializing_if = "Option::is_none")]
|
||||||
pub id: Option<ObjectId>,
|
pub id: Option<ObjectId>,
|
||||||
#[serde(rename="_auth")]
|
#[serde(rename="_auth")]
|
||||||
pub auth: Auth,
|
pub auth: Auth,
|
||||||
pub username: String,
|
pub username: String,
|
||||||
|
#[serde(skip_serializing)]
|
||||||
|
logged_in: bool,
|
||||||
}
|
}
|
||||||
impl User {
|
impl User {
|
||||||
pub fn new(username: String) -> Self {
|
pub fn new(username: String) -> Self {
|
||||||
let id = None;
|
let id = None;
|
||||||
let auth = Default::default();
|
let auth = Default::default();
|
||||||
|
let logged_in = false;
|
||||||
Self {
|
Self {
|
||||||
id,
|
id,
|
||||||
auth,
|
auth,
|
||||||
username,
|
username,
|
||||||
|
logged_in,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[derive(Default, Serialize, Deserialize)]
|
#[async_trait]
|
||||||
|
impl Authentication<User, ObjectId, Client> for User {
|
||||||
|
async fn load_user(user_id: ObjectId, db: Option<&Client>) -> Result<User> {
|
||||||
|
Ok(db.unwrap()
|
||||||
|
.database("dermy")
|
||||||
|
.collection::<User>("users")
|
||||||
|
.find_one(doc! {"_id": user_id}, None).await?.unwrap())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_authenticated(&self) -> bool {
|
||||||
|
self.logged_in
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_active(&self) -> bool {
|
||||||
|
self.logged_in
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_anonymous(&self) -> bool {
|
||||||
|
!self.logged_in
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[derive(Clone, Default, Serialize, Deserialize)]
|
||||||
pub struct Auth {
|
pub struct Auth {
|
||||||
#[serde(rename = "_hash", skip_serializing_if = "Option::is_none")]
|
#[serde(rename = "_hash", skip_serializing_if = "Option::is_none")]
|
||||||
pub hash: Option<String>,
|
pub hash: Option<String>,
|
||||||
|
|
|
||||||
32
src/lib.rs
32
src/lib.rs
|
|
@ -1,11 +1,29 @@
|
||||||
mod account;
|
mod account;
|
||||||
mod model;
|
mod model;
|
||||||
|
|
||||||
pub async fn run() {
|
use account::db::User;
|
||||||
let app = router();
|
use anyhow::Result;
|
||||||
|
use axum_session::{SessionConfig, SessionLayer, SessionStore};
|
||||||
|
use axum_session_auth::{AuthConfig, AuthSessionLayer};
|
||||||
|
use axum_session_mongo::SessionMongoPool;
|
||||||
|
use mongodb::{bson::oid::ObjectId, Client};
|
||||||
|
|
||||||
|
pub async fn run() -> Result<()> {
|
||||||
|
let db = Client::with_uri_str("mongodb://localhost:27017").await?;
|
||||||
|
let session_store = session(db.clone()).await?;
|
||||||
|
let auth_config = AuthConfig::<ObjectId>::default();
|
||||||
|
|
||||||
|
|
||||||
|
let app = router()
|
||||||
|
.layer(SessionLayer::new(session_store))
|
||||||
|
.layer(AuthSessionLayer::<User, ObjectId, SessionMongoPool, Client>
|
||||||
|
::new(Some(db)).with_config(auth_config)
|
||||||
|
);
|
||||||
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
|
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
|
||||||
|
|
||||||
axum::serve(listener, app).await.unwrap();
|
axum::serve(listener, app).await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn router() -> axum::Router {
|
fn router() -> axum::Router {
|
||||||
|
|
@ -13,3 +31,11 @@ fn router() -> axum::Router {
|
||||||
.nest("/account", account::router())
|
.nest("/account", account::router())
|
||||||
.nest("/predict", model::router())
|
.nest("/predict", model::router())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn session(db: Client) -> Result<SessionStore<SessionMongoPool>> {
|
||||||
|
let session_config = SessionConfig::default()
|
||||||
|
.with_table_name("sessions");
|
||||||
|
|
||||||
|
Ok(SessionStore::<SessionMongoPool>
|
||||||
|
::new(Some(db.clone().into()), session_config).await?)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,7 @@
|
||||||
|
use anyhow::Result;
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() {
|
async fn main() -> Result<()> {
|
||||||
dermy_server::run().await;
|
dermy_server::run().await?;
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue