mORMot 1.18 第19章 安全性
第19章 安全性
在企業數據庫設計中,安全性是必不可少的。mORMot已爲此做好準備。
19.1 HTTP/HTTPS
您可以在四個受支持的模式中的任何一箇中進行選擇,它們可以組合使用。
Pascal類 | 描述 |
---|---|
TSQLRestServerAuthenticationDefault | mORMot安全認證,作爲一種專有的雙重挑戰和SHA-256哈希 |
TSQLRestServerAuthenticationSSPI | Windows認證,通過已登錄的用戶進行 |
TSQLRestServerAuthenticationNone | 僅基於用戶名的簡單認證(較弱) |
TSQLRestServerAuthenticationHttpBasic | HTTP基本認證 警告:密碼未加密 |
默認是TSQLRestServerAuthenticationDefault和TSQLRestServerAuthenticationSPPI的組合。這些指定了用於mORMot客戶端的內部專有安全性,以及SPPI,即Windows HTTP認證,該認證可與Windows客戶端的已登錄用戶ID自動配合工作。
在用戶修改模型創建並添加TSQLAuthUser和TSQLAuthGroup這兩個類之前,用戶ID和密碼不會被強制執行。
查看我們之前項目中的csclass.pas,我們的函數更改爲:
function CreateSampleModel: TSQLModel;
begin
// 安全性 - 添加安全類 *Auth*
result := TSQLModel.Create([TSQLAuthUser, TSQLAuthGroup, TSQLSampleRecord]);
end;
然後在客戶端的啓動過程中添加以下行:
procedure Start;
var
Server: AnsiString;
userid: RawUTF8;
password: RawUTF8;
begin
if ParamCount = 0 then
Server := 'localhost'
else
Server := AnsiString(Paramstr(1));
Model := CreateSampleModel;
DB := TSQLHttpClient.Create(Server, '8080', Model);
userid := 'joe';
password := 'synopse';
if not DB.SetUser(userid, password) then
raise Exception.CreateFmt('%s: 服務器拒絕了 "%s" 的憑據', [Server, userid]);
end;
重新編譯客戶端和服務器以滿足新模型的要求。然後在一個窗口中運行服務器。
當您運行客戶端時,會顯示localhost: 服務器拒絕了“joe”的憑據,並且程序會停止。
嘗試將userid更改爲具有相同密碼“synopse”的“User”,然後重新編譯客戶端。現在您不會收到錯誤,但讀取和寫入會失敗。身份驗證已成功,但授權阻止了您查看數據。
最後,在不更改密碼的情況下將userid更改爲“Admin”。重新編譯後,程序將完美運行。我們通過了身份驗證,並獲得了完成工作的授權。
DB.CreateMissingTables這一行自動添加了默認的用戶ID:
管理員、主管、用戶和訪客,密碼都是“synopse”。
請務必在任何數據庫上更改這些默認密碼,或刪除這些用戶ID。
mORMot 文檔中有關於用戶ID和密碼的最新詳細信息,但在我寫這篇文章的時候,SQLAuthUser 記錄的 JSON 格式如下:
[{
"AuthUser": [{
"RowID": 1,
"LogonName": "Admin",
"DisplayName": "Admin",
"PasswordHashHexa": "67aeea294e1cb515236fd7829c55ec820ef888e8e221814d24d83b3dc4d825dd",
"GroupRights": 1,
"Data": null
},
{
"RowID": 2,
"LogonName": "Supervisor",
"DisplayName": "Supervisor",
"PasswordHashHexa": "67aeea294e1cb515236fd7829c55ec820ef888e8e221814d24d83b3dc4d825dd",
"GroupRights": 2,
"Data": null
},
{
"RowID": 3,
"LogonName": "User",
"DisplayName": "User",
"PasswordHashHexa": "67aeea294e1cb515236fd7829c55ec820ef888e8e221814d24d83b3dc4d825dd",
"GroupRights": 3,
"Data": null
}
]
},
{
"AuthGroup": [{
"RowID": 1,
"Ident": "Admin",
"SessionTimeout": 10,
"AccessRights": "11,1-256,0,1-256,0,1-256,0,1-256,0"
},
{
"RowID": 2,
"Ident": "Supervisor",
"SessionTimeout": 60,
"AccessRights": "10,1-256,0,3-256,0,3-256,0,3-256,0"
},
{
"RowID": 3,
"Ident": "User",
"SessionTimeout": 60,
"AccessRights": "10,3-256,0,3-256,0,3-256,0,3-256,0"
},
{
"RowID": 4,
"Ident": "Guest",
"SessionTimeout": 60,
"AccessRights": "0,3-256,0,0,0,0"
}
]
}
]
權限是應用於用戶組的。您可以創建任何您想要的組,但默認組如下所示。
組 | 提交SQL | 查詢SQL | 認證讀 | 認證寫 | 表讀 | 表寫 | 服務 |
---|---|---|---|---|---|---|---|
Admin | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
Supervisor | 是 | 否 | 是 | 否 | 是 | 是 | 是 |
User | 否 | 否 | 否 | 否 | 是 | 是 | 是 |
Guest | 否 | 否 | 否 | 否 | 是 | 否 | 否 |
這個表格概述了不同用戶組所享有的權限。例如,“Admin”組擁有所有權限,包括提交SQL查詢、查詢SQL、認證讀寫、表讀寫以及服務訪問。相比之下,“Guest”組的權限則非常有限,只能讀取表數據,無法進行其他操作。
在實際應用中,您可以根據實際需求創建和調整用戶組及其權限,以滿足不同用戶或用戶羣體的訪問需求。這有助於確保數據的安全性和完整性,同時提供靈活性和可管理性。
19.2 數據庫加密
mORMot 支持透明的數據庫加密,以保護您的數據免受未經授權的訪問。您可以通過設置 TSQLModel
的 EncryptionKey
屬性來啓用加密。此密鑰用於在數據寫入磁盤之前對其進行加密,並在讀取時對其進行解密。
Model := TSQLModel.Create([...]); // 創建模型
Model.EncryptionKey := 'MySecretEncryptionKey'; // 設置加密密鑰
警告: 請確保牢記加密密鑰,因爲如果丟失,將無法恢復加密的數據。
19.3 訪問控制和權限
mORMot 提供了一個靈活的權限系統,允許您控制哪些用戶可以訪問數據庫的哪些部分。這通過 TSQLAuthUser
和 TSQLAuthGroup
類實現,它們允許您定義用戶和組,並分配相應的權限。
例如,您可以爲用戶分配不同的角色,如“管理員”、“編輯者”或“查看者”,併爲每個角色設置不同的權限級別。
19.4 日誌和審計
爲了增強安全性,mORMot 還支持詳細的日誌記錄,以便您可以跟蹤誰何時訪問了哪些數據。這對於審計和合規性檢查特別有用。
您可以通過配置 TSQLRestServer
的日誌設置來啓用日誌記錄,並選擇要記錄的信息級別。
19.5 備份和恢復
定期備份您的數據庫是保護數據免受丟失或損壞的重要步驟。mORMot 提供了用於備份和恢復數據庫的功能。
您可以使用 TSQLRestClient
或 TSQLRestServer
的方法來備份數據庫到文件,並在需要時從該文件恢復。
19.6 網絡安全性
當通過網絡與數據庫通信時,確保通信的安全性至關重要。mORMot 支持通過 HTTPS 進行安全通信,您可以使用 SSL/TLS 證書來加密客戶端和服務器之間的數據傳輸。
爲了設置 HTTPS,您需要在服務器上配置 SSL/TLS 證書,並確保客戶端配置爲信任該證書。
小結
mORMot 提供了一個全面的安全性框架,涵蓋了身份驗證、授權、加密、日誌記錄、備份恢復和網絡安全性等多個方面。當設計和實現企業數據庫解決方案時,請務必考慮並應用這些安全措施來保護您的數據和系統免受潛在威脅。