標籤:sqlite3_set_authorizer
sqlite3_set_authorizer
大部分的參考資料,都是寫明了註冊授權函數這幾個簡單的字面意思而已,在實際上,可以將一個如下面格式的my_authorizer函數,註冊到SQLite語句的解釋執行語句當中,並且最先被執行,就像是一個鉤子,對sql語句進行一些訪問的控制,類似於網路資料包的netfilter。
如下是一個簡單的例子:
#include <iostream>#include "sqlite/sqlite3.h"using namespace std;/*該註冊的回呼函數,禁止使用者刪除任何的表,實際上,第三個參數會傳遞進來當前操作的表的名稱,可以通過和該值進行匹配,是否需要對該表進行操作,當然由於pszString是一個無符號整型,如果有多個參數想傳遞進來,可以設定sqlite3_set_authorizer的第三個參數為結構體,然後通過將pszString進行類型的強制轉換,返回SQLITE_OK,表示繼續執行,返回SQLITE_DENY表示拒絕執行*/int my_authorizer(void* pszString, int nCode, const char* psz1, const char* psz2, const char* psz3, const char* psz4){ int nNotPermitCode = *(int*)pszString; if (nNotPermitCode == 11) { printf("can not execute drop\n"); return SQLITE_DENY; } return SQLITE_OK;}int main(){ int rc = 0; sqlite3* db = NULL; char* pdbName = "test0.db"; char* pszErrMsg = NULL; rc = sqlite3_open_v2(pdbName,&db,SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE,NULL); char* pszCreateTb1 = "create virtual table geo_test1 using rtree_i32(id, minx, maxx)"; rc = sqlite3_exec(db,pszCreateTb1, 0, 0, &pszErrMsg); char* pszInsertsql1 = "insert into geo_test1 values(1, 400, 400)"; rc = sqlite3_exec(db,pszInsertsql1, 0, 0, &pszErrMsg); char* pszDropTable = "drop table geo_test1"; /* 授權動作編碼(Authorizer Action Codes) 摘自:https://www.sqlite.org/c3ref/c_alter_table.html 每一種授權作業碼都會傳遞不同的參數給授權註冊函數,詳細參考 網址。11是刪除資料庫表的授權作業碼,當調用授權註冊函數的時候 第三個字串將獲得當前被操作的表的名稱。 */ int nNotPermitCode = 11; /* 第三個參數是傳遞給授權註冊函數的參數值 */ sqlite3_set_authorizer(db, my_authorizer, &nNotPermitCode); sqlite3_stmt* statement; rc = sqlite3_prepare_v2(db, pszDropTable, -1, &statement, NULL); /* 單步調試到perr的錯誤資訊:no authored,表示無權操作 */ const char* pszErr = sqlite3_errmsg(db); sqlite3_close(db); return 0;}
SQLite sqlite3_set_authorizer調用常式