簡體   English   中英

REST API - 如何實現用戶特定授權?

[英]REST API - How to implement user specific authorisation?

So I'm currently learning/building a REST API backend server for my web application using NodeJS, ExpressJS, and MySQL as the database. 我的問題是關於實施授權以確保用戶 A 不會訪問或編輯屬於另一個用戶的數據的最佳方式。 請注意,我了解有很多實施基於角色的授權的示例(即用戶組與管理員組等),但這不是我要問的。 相反,我如何授權用戶訪問他們正在訪問的數據?

我可能想多了,這甚至沒有必要; 我應該在每個 SQL 查詢中檢查數據是否屬於用戶,但我想我會問是否有中間件或策略架構來處理這個問題,或者甚至可以通過緩存進行授權。

我能想到的唯一解決方案是每個 SQL 查詢都返回用戶 ID 和結果,然后我只創建一個服務來檢查每個結果是否匹配。 如果是,則繼續。 如果不回滾查詢並返回未經授權的錯誤。 這個可以嗎?

我非常感謝您的建議,幫助,如果您能指出我正確的方向。

提前謝謝了。

在每個表中保存 userId(或 ownerId),並創建一個中間件,其中每個 db 訪問方法都需要 userId 作為參數,例如:

readOne(id, userId) {
    // implements SELECT * FROM example WHERE id = id AND userId = userId
}

updateOne(id, data, userId) {
    // implements UPDATE example SET data = data WHERE id = id AND userId = userId
}
...

出於安全原因,切勿將“您不是所有者請求的數據存在”作為響應發送。

最簡單的事情通常效果最好。 您不必擁有檢查每個實體的授權權限的特殊服務,您可以在數據訪問級別執行此操作,例如。 SELECT * FROM foo WHERE user_id =:currentUserUPDATE foo SET foo = bar WHERE user_id =:currentUser

這還取決於您是否要通過 HTTP401 通知用戶有關未經允許的訪問,或者是否要顯示對於不同的用戶 HTTP404 甚至存在這樣的資源。

對於 HTTP401,場景將是:

const entity = loadFromDB(id);
if(entity.userId !== currentUserId) { 
  res.send(401); 
  return;
}

... update entity logic ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM