SQL Server 帳號權限管理及編程應用(圖解)


昨晚在群里講解這部分內容,因為好久沒操作過了,差點翻車。。。今天把它整理一下發出來,方便沒聽明白的小伙伴學習和理解。
我們平時學習數據庫時,要么使用sa帳號,要么用windows默認帳號登錄,總之都擁有最高權限,而實際的生產環境中,不可能這樣的,帳號權限要嚴格划分,才能保證基本的安全,那么問題來了,如何為帳號分配權限呢?應用程序需要更高的操作權限,該怎么辦呢?下面我們就來解決這兩個問題!

任務目標

  1. 為帳號分配權限,實現對不同表授予不同的增刪改查等權限
  2. 同一帳號,在不同場景下擁有不同權限

任務1:實現

任務描述:創建一個帳號AppUser,密碼123,它只能訪問test2數據庫,對數據表授予不同權限,如下表所示

表名 SELECT INSERT UPDATE DELETE
Student
Course
Score
Class
Exam

實現步驟

1、創建【登錄名】:安全性——登錄名——新建登錄名,如圖所示

2、【常規】頁面 → 輸入登錄名AppUser → 輸入密碼123 → 不勾選“強制實施密碼策略” → 默認數據庫test2

3、【用戶映射】頁面 → 在test2數據庫前面勾選,用戶處自動出現AppUser → “確定”按鈕,創建的登錄名將出現在列表的最下面。

4、【數據庫】 → test2 → 安全性 → 角色 → 數據庫角色 → 右鍵 → 新建數據庫角色,

5、【常規】頁面 → 輸入角色名稱MyRole → 添加 → 瀏覽 → 勾選AppUser ,在“角色成員”列表中出現AppUser

6、【安全對象】頁面 → 【搜索】 → 特定對象 → 對象類型 → 勾選“表”,確定 → 瀏覽 → 勾選Student等5個表,確定,確定 → 分別選擇安全對象,並對其授權

注意:【更新】指的是UPDATE語句,【更改】是ALTER語句

表名 SELECT(選擇) INSERT(插入) UPDATE(更新) DELETE(刪除)
Student
Course
Score
Class
Exam

任務1:驗證

1、用剛剛創建的登陸名AppUser登錄,然后試圖查看其他數據庫,均提示無權訪問,只能訪問test2,證明我們的授權有效。

2、對幾張表進行增刪改查的驗證,SQL語句及結果如下:

SELECT * FROM dbo.Class
--結果:拒絕了對對象 'Class' (數據庫 'test2',架構 'dbo')的 SELECT 權限。
UPDATE dbo.Score SET Score=90 WHERE Id=1
--結果:拒絕了對對象 'Score' (數據庫 'test2',架構 'dbo')的 UPDATE 權限。
DELETE dbo.Course WHERE Id=1
--結果:拒絕了對對象 'Course' (數據庫 'test2',架構 'dbo')的 DELETE 權限。

而對Student表的操作不受限制,如下圖所示,證明我們的授權是有效的。

任務2:實現

任務描述:我們還是使用AppUser帳號,在應用程序中具有不同的權限(一般來說在App中應該有更高的權限),如:目前我們只能對Class表進行插入操作,隨后我們讓它具備增刪改查的權限。

實現步驟

1、切換sa帳號(否則無權做后面的事) → 【test2】數據庫 → 安全性 → 角色應用程序角色 → 右鍵“新建應用程序角色”

2、【常規】頁面 → 角色名稱Approle,密碼456

3、【安全對象】頁面 → 【搜索】 → 特定對象,確定 → 對象類型 → 勾選“表”,確定 → 瀏覽 → 勾選Class等5個表,確定 → 對5個表全部授予“增刪改查”權限

任務2:驗證

總體思路:我們使用C#語言創建一個控制台應用程序,依然使用之前創建的AppUser帳號和密碼進行登錄,然后授予剛剛創建的Approle角色,來達到臨時提升AppUser帳號權限的效果。

關鍵步驟:

1、設置連接字符串,使用的是AppUser帳號和密碼

private static string ConnectionString = "Data Source=127.0.0.1,3300;User Id=AppUser;Password=123;Initial Catalog=test2;Pooling=true;Min Pool Size=1";

2、通過執行以下SQL語句臨時授予Approle角色權限

EXEC sys.sp_setapprole @rolename='Approle',@password='456'

執行效果:

主要代碼:

static void Main(string[] args)
{
	var db = Db.Instance;
	Console.WriteLine("-------- 授予Approle角色前 -------");
	try
	{
		db.Select<Class>().ToList();
	}
	catch (Exception ex)
	{
		Console.WriteLine($"無權查看,錯誤信息:{ex.Message}");
	}
	db.Ado.ExecuteNonQuery("EXEC sys.sp_setapprole @rolename='Approle',@password='456'");
	Console.WriteLine("-------- 授予Approle角色后 -------");
	Console.WriteLine($"Class表有{db.Select<Class>().Count()}條記錄");
	Console.WriteLine("-------- 修改前 -------");
	db.Select<Class>().Take(2).ToList().ForEach(x => Console.WriteLine($"Id:{x.Id}    Name:{x.Name}"));
	Console.WriteLine("-------- 修改第1條數據 -------");
	db.Update<Class>(1).Set(a => a.Name , "測試Update").ExecuteAffrows();
	Console.WriteLine("-------- 修改后 -------");
	db.Select<Class>().Take(2).ToList().ForEach(x => Console.WriteLine($"Id:{x.Id}    Name:{x.Name}"));

	Console.Read();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM