如何根據用戶角色隱藏/顯示結構的一些 json 欄位?我們真的不想創建 x 種不同型別的結構。或者 x 型別的資料庫用戶或多個(相同的)sql 命令。你們有什么建議嗎?哪個板條箱適合那里?在 Golang 上,我們使用反射包來比較欄位標簽是否包含角色。
匯出示例應該是這樣的:
Filtering with role user:
{
"id": "1",
"name": "Jack"
}
Filtering with role hr:
{
"id": "1",
"name": "Jack",
"salary": 100000,
"boss": {
"id": "2",
"name": "John",
"salary": 120000,
"password": "pwd",
"rights": {
"create": true,
"update": true
}
}
}
Filtering with role admin:
{
"id": "1",
"name": "Jack",
"salary": 100000,
"password": "password321",
"rights": {
"create": false,
"update": false
},
"boss": {
"id": "2",
"name": "John",
"salary": 120000,
"password": "pwd",
"rights": {
"create": true,
"update": true
}
}
}
這些問題類似于使用 golang GOALNG語言提出的問題和答案:根據用戶角色控制欄位可見性,但在 rust 中看起來如何?
uj5u.com熱心網友回復:
Rust 中最常用的 JSON crate 是serde。您可以實作所需的一種方法是創建不同的Values,具體取決于用戶的角色(例如,通過使用json!宏或手動創建Value實體)。另一種是使用具有 3 個變體的列舉 - 每個用戶角色一個變體(請參閱列舉表示)。
作為旁注,我不禁注意到您在 JSON 中回傳密碼。這看起來確實是一個嚴重的安全問題,我幾乎想不出我什至想將編碼密碼回傳給客戶端的情況。通常,密碼只有“一種方式”:從客戶端到服務器。
uj5u.com熱心網友回復:
為了補充at54321的解決方案,你實際上并沒有復制的結構本身,而是可以使用扁平化和/或有條件的系列化跳躍如
#[derive(Serialize)]
struct User {
id: String,
name: String,
#[serde(flatten, skip_serializing_if = "Option::is_none")]
_hr: Option<HrView>,
#[serde(flatten, skip_serializing_if = "Option::is_none")]
_admin: Option<AdminView>
}
#[derive(Serialize)]
struct HrView {
salary: u32,
#[serde(skip_serializing_if = "Option::is_none")]
boss: Option<Box<User>>
}
#[derive(Serialize)]
struct AdminView {
password: String,
rights: Rights,
}
#[derive(Serialize)]
struct Rights {
create: bool,
update: bool
}
演示:https : //play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=09fd30ce1f013514d0dc18cf6720f80b
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/407268.html
標籤:
