feat(ayarlar): hane ve üyeler, davet bağlantısı, hesap ve şifre, bütçe varsayılanları
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -3,7 +3,8 @@
|
||||
//! Bir route parametrelerine `user: AuthUser` eklediğinde, Axum isteği işlemeden önce:
|
||||
//! 1. cookie'deki JWT'nin imzasını ve süresini doğrular,
|
||||
//! 2. kullanıcının veritabanında hâlâ var olduğunu ve aynı haneye ait olduğunu kontrol eder
|
||||
//! (silinen kullanıcının token'ı anında geçersiz olur, rol değişikliği hemen etkili olur).
|
||||
//! (silinen kullanıcının token'ı anında geçersiz olur, rol değişikliği hemen etkili olur),
|
||||
//! 3. jeton şifre değişikliğinden önce verilmişse reddeder (`sessions_valid_from`).
|
||||
//!
|
||||
//! Herhangi biri başarısızsa route hiç çalışmaz, 401 döner.
|
||||
//! **Hane izolasyonu:** route'lar hane kimliğini her zaman `AuthUser.household_id`'den alır,
|
||||
@@ -67,6 +68,9 @@ impl AuthUser {
|
||||
#[derive(Deserialize)]
|
||||
struct RoleOnly {
|
||||
role: Role,
|
||||
/// Şifre değişince "şimdi": bundan önce verilmiş jetonlar geçersiz
|
||||
#[serde(default)]
|
||||
sessions_valid_from: Option<i64>,
|
||||
}
|
||||
|
||||
impl FromRequestParts<AppState> for AuthUser {
|
||||
@@ -85,9 +89,15 @@ impl FromRequestParts<AppState> for AuthUser {
|
||||
.db
|
||||
.collection::<RoleOnly>(col::USERS)
|
||||
.find_one(doc! { "_id": user_id, "household_id": household_id, "deleted_at": null })
|
||||
.projection(doc! { "role": 1 })
|
||||
.projection(doc! { "role": 1, "sessions_valid_from": 1 })
|
||||
.await?
|
||||
.ok_or(AppError::Unauthorized)?;
|
||||
if current
|
||||
.sessions_valid_from
|
||||
.is_some_and(|from| (claims.iat as i64) < from)
|
||||
{
|
||||
return Err(AppError::Unauthorized);
|
||||
}
|
||||
|
||||
Ok(Self {
|
||||
user_id,
|
||||
|
||||
Reference in New Issue
Block a user