WCF技术实现基于角色的访问控制
第一次寫,小緊張!
即將畢業了,現在將我畢業設計中用到的小的編程技術以及自己的一些理解分享出來,希望可以做點小貢獻。
首先要感謝網上各路大神無私的分享,沒有你們,就沒有我的收獲。
在大四之前,對于編程只是學習過簡單的C語言,從來沒有接觸過工程實踐。最后的畢業設計肯定要開發程序,于是認真學習了一段時間。
我的畢業設計是開發一個信息管理系統,希望簡單實現對學生信息的管理。系統的前端決定使用MVC模式(當下比較流行,但是好難學!),后臺的管理用到了WCF技術,體現一種SOA思想。
今天主要講講WCF技術如何實現基于角色的訪問控制,這里只是涉及基本原理,高手勿噴!
一、基于角色訪問控制原理
(1)用戶
用戶是指系統的使用者,是一個能夠對系統進行訪問和操作的實體。
(2)角色
角色是整個RBAC模型中的關鍵,角色是用戶和系統權限中間的媒介,將用戶和系統權限相分離,起橋梁及紐帶的作用。角色可以被分配給用戶,進而和用戶建立關聯;角色也可以被分配權限,進而和訪問權限建立關聯。
在實際的系統中,用戶可以根據需要被分配多個角色,比如一個人既是單位的董事長又是單位的足球隊長;角色也可以根據需要被分配多個權限,比如部門經理角色可以被分配人事任免權和決策權。
(3)權限
權限是指系統使用者對系統資源進行訪問和操作的能力,在RBAC中,用戶通過被分配相應的角色而間接獲得了所需的權限。
(4)會話
會話在訪問控制中起標記作用,用戶和角色通過建立持續一段時間的會話來進行關聯。一個用戶在一次操作周期中,可以通過一個會話關聯多個不同的角色,當然也可以通過多個不同的會話關聯更多的角色。而用戶的權限就是這些關聯的角色的權限之和。
(5)角色等級
角色等級RH(Role Hierarchy)在現實的系統中可以直接體現出使用該系統的企業或單位的權力等級和責任劃分,在程序設計中也方便通過繼承進行授權。
二、訪問控制服務功能模塊設計
該服務按照功能可以劃分為如下幾個部分:用戶管理模塊、角色管理模塊、授權管理模塊和權限判定模塊。
三、授權管理流程設計
四、訪問控制流程設計
五、數據庫設計
下圖是VS中LINQ to SQL類的設計圖,這個類用于連接SQL Server數據庫,好用,推薦!
六、WCF契約設計
在下文的數據契約中,權限中有Controller和Action兩個變量,這是因為我的這個WCF訪問控制后臺是和MVC前端結合的,大家在用的時候,需要根據自己的程序來設計權限中的變量。
1 [ServiceContract] 2 public interface IServiceAuthenticate 3 { 4 //用戶注冊,輸入用戶信息和會話信息進行用戶注冊 5 [OperationContract] 6 string Register(UserInfos userinfo, SessionInfos sessioninfo); 7 //用戶刪除,輸入用戶信息進行用戶刪除 8 [OperationContract] 9 string DeleteUser(UserInfos userinfo); 10 //用戶登錄,輸入用戶信息和會話信息進行用戶登錄 11 [OperationContract] 12 string Login(UserInfos userinfo, SessionInfos sessioninfo); 13 //用戶登出,輸入會話信息進行用戶登出 14 [OperationContract] 15 string Logout(SessionInfos sessioninfo); 16 //狀態查詢,輸入會話信息查詢當前用戶的登錄和操作狀態 17 [OperationContract] 18 string StateQuery(SessionInfos sessioninfo); 19 //創建角色,輸入角色信息進行角色創建 20 [OperationContract] 21 string CreateRole(Role role); 22 //刪除角色,輸入角色信息進行角色刪除 23 [OperationContract] 24 string DeleteRole(Role role); 25 //用戶角色分配,輸入用戶信息和角色信息為用戶分配角色 26 [OperationContract] 27 string CreateUserRole(UserInfos userinfo, Role role); 28 //刪除用戶角色分配,輸入用戶信息和角色信息刪除特定的用戶角色關系 29 [OperationContract] 30 string DeleteUserRole(UserInfos userinfo, Role role); 31 //角色權限分配,輸入角色信息和權限信息為特定角色分配權限 32 [OperationContract] 33 string CreateRoleAuthority(Role role, Authority authority); 34 //刪除角色權限分配,輸入角色信息和權限信息刪除特定的角色權限關系 35 [OperationContract] 36 string DeleteRoleAuthority(Role role, Authority authority); 37 //權限判定,輸入會話信息和權限信息判定當前用戶有無相應的權限 38 [OperationContract] 39 bool AuthorityJudge(SessionInfos sessioninfo, Authority authority); 40 41 } 42 43 //再定義幾個常用的數據契約 44 [DataContract] 45 public class UserInfos 46 { 47 [DataMember] 48 public string Name { get; set; } 49 [DataMember] 50 public string HashPWD { get; set; } 51 } 52 [DataContract] 53 public class SessionInfos 54 { 55 [DataMember] 56 public string IP { get; set; } 57 [DataMember] 58 public string Browser { get; set; } 59 60 } 61 [DataContract] 62 public class Role 63 { 64 [DataMember] 65 public string RoleName { get; set; } 66 [DataMember] 67 public string Father { get; set; } 68 [DataMember] 69 public int RoleLevel { get; set; } 70 } 71 [DataContract] 72 public class Authority 73 { 74 [DataMember] 75 public string ActionName { get; set; } 76 [DataMember] 77 public string ControllerName { get; set; } 78 }七、各個功能模塊實現
我在開發時使用的SQL Server 2016,數據庫連接使用的是LINQ to SQL,因此在程序開頭需要定義連接:
UserDataClassesDataContext db = new UserDataClassesDataContext();1、用戶管理功能實現
1 //用戶注冊 2 public string Register(UserInfos userinfos,SessionInfos sessioninfos) 3 { 4 if (db.UserInfo.Where(m => m.Name == userinfos.Name).Count() > 0) 5 return "User Existed"; 6 else 7 { 8 UserInfo rec=new UserInfo(); 9 10 rec.Name = userinfos.Name; 11 rec.HashPWD = userinfos.HashPWD; 12 rec.RegDateTime = DateTime.Now; 13 rec.RegBrowser = sessioninfos.Browser; 14 rec.RegIP = sessioninfos.IP; 15 16 db.UserInfo.InsertOnSubmit(rec); 17 db.SubmitChanges(); 18 19 return "Welcome new user:" + userinfos.Name; 20 21 } 22 } 23 24 //用戶刪除 25 public string DeleteUser(UserInfos userinfos) 26 { 27 var rec = db.UserInfo.FirstOrDefault(m => m.Name == userinfos.Name); 28 if (rec != null) 29 { 30 db.UserInfo.DeleteOnSubmit(rec); 31 db.SubmitChanges(); 32 return "Delete Success"; 33 } 34 else 35 return "User not Exist"; 36 }2、角色管理功能實現
1 //創建角色 2 public string CreateRole(Role role) 3 { 4 if (db.RoleInfo.Where(m => m.RoleName == role.RoleName).Count() > 0) 5 return "Role Existed"; 6 else 7 { 8 RoleInfo rec = new RoleInfo(); 9 rec.RoleName = role.RoleName; 10 rec.CreateTime = System.DateTime.Now; 11 rec.Father = role.Father; 12 rec.RoleLevel = role.RoleLevel; 13 14 db.RoleInfo.InsertOnSubmit(rec); 15 db.SubmitChanges(); 16 return "Create Success"; 17 } 18 } 19 //刪除角色 20 public string DeleteRole(Role role) 21 { 22 var rec = db.RoleInfo.FirstOrDefault(m => m.RoleName == role.RoleName); 23 if(rec!=null) 24 { 25 db.RoleInfo.DeleteOnSubmit(rec); 26 db.SubmitChanges(); 27 return "Delete Success"; 28 } 29 else 30 { 31 return "Role not Exist"; 32 } 33 }3、授權管理功能實現
1 //創建用戶-角色規則 2 public string CreateUserRole(UserInfos userinfo, Role role) 3 { 4 //先判斷用戶名是否存在 5 if (db.UserInfo.Where(m => m.Name == userinfo.Name).Count() > 0) 6 { 7 //再判斷角色名是否存在 8 if(db.RoleInfo.Where(m => m.RoleName == role.RoleName).Count() > 0) 9 { 10 //再判斷想要添加的規則是否存在 11 if (db.UserRole.Where(m => m.UserName == userinfo.Name && m.RoleName == role.RoleName).Count() > 0) 12 return "Rule Exist"; 13 else 14 { 15 //寫入想要添加的用戶-角色規則 16 UserRole rec = new UserRole(); 17 rec.UserName = userinfo.Name; 18 rec.RoleName = role.RoleName; 19 rec.CreateTime = System.DateTime.Now; 20 21 db.UserRole.InsertOnSubmit(rec); 22 db.SubmitChanges(); 23 //根據權限繼承原理,將角色的子角色也賦給用戶 24 List < RoleInfo> userrolelist= db.RoleInfo.Where(m => m.Father == role.RoleName).ToList(); 25 for(int i = 0; i < userrolelist.Count; i++) 26 { 27 UserRole rec2 = new UserRole(); 28 rec2.UserName = userinfo.Name; 29 rec2.RoleName = userrolelist[i].RoleName; 30 rec2.CreateTime = System.DateTime.Now; 31 db.UserRole.InsertOnSubmit(rec2); 32 db.SubmitChanges(); 33 } 34 return "Create Success"; 35 } 36 } 37 else 38 { 39 return "Role not Exist"; 40 } 41 } 42 else 43 { 44 return "User not Exist"; 45 } 46 } 47 //刪除用戶-角色規則 48 public string DeleteUserRole(UserInfos userinfo, Role role) 49 { 50 if(db.UserInfo.Where(m=>m.Name==userinfo.Name).Count()>0 51 &&db.RoleInfo.Where(m=>m.RoleName==role.RoleName).Count()>0) 52 { 53 var rec = db.UserRole.FirstOrDefault(m => m.UserName == userinfo.Name && m.RoleName == role.RoleName); 54 if(rec!=null) 55 { 56 db.UserRole.DeleteOnSubmit(rec); 57 db.SubmitChanges(); 58 return "Delete Suceess"; 59 } 60 else 61 { 62 return "Rule not Exist"; 63 } 64 } 65 else 66 { 67 return "Delete Fail"; 68 } 69 } 70 //創建角色-權限規則 71 public string CreateRoleAuthority(Role role, Authority authority) 72 { 73 //判斷角色是否存在 if(db.RoleInfo.Where(m=>m.RoleName==role.RoleName).Count()>0) 74 { 75 //查詢角色關聯的所有規則,找出是否存在想要添加的規則 76 var rec= db.RoleAuthority.FirstOrDefault(m => m.RoleName == role.RoleName 77 && m.ActionName == authority.ActionName && m.ControllerName == authority.ControllerName); 78 79 if(rec!=null) 80 { 81 return "Rule Exist"; 82 } 83 //規則不存在,則添加 84 else 85 { 86 RoleAuthority rec2 = new RoleAuthority(); 87 rec2.RoleName = role.RoleName; 88 rec2.ActionName = authority.ActionName; 89 rec2.ControllerName = authority.ControllerName; 90 rec2.CreateTime = System.DateTime.Now; 91 92 db.RoleAuthority.InsertOnSubmit(rec2); 93 db.SubmitChanges(); 94 return "Create Success"; 95 } 96 } 97 else 98 { 99 return "Role not Exist"; 100 } 101 } 102 //刪除角色權限規則 103 public string DeleteRoleAuthority(Role role, Authority authority) 104 { 105 var rec = db.RoleAuthority.FirstOrDefault(m => m.RoleName == role.RoleName 106 && m.ActionName == authority.ActionName && m.ControllerName == authority.ControllerName); 107 if(rec==null) 108 { 109 return "Rule not Exist"; 110 } 111 else 112 { 113 db.RoleAuthority.DeleteOnSubmit(rec); 114 db.SubmitChanges(); 115 return "Delete Success"; 116 } 117 } 授權管理功能4、訪問控制功能實現
1 //用戶認證 2 public string Login(UserInfos userinfos, SessionInfos sessioninfos) 3 { 4 5 if (!(db.UserInfo.Where(m => m.Name == userinfos.Name).Count() > 0)) 6 { 7 return "Please Register Firstly!"; 8 } 9 else 10 { 11 UserInfo rec = new UserInfo(); 12 rec = db.UserInfo.Where(m => m.Name == userinfos.Name).First(); 13 14 if (rec.HashPWD == userinfos.HashPWD) 15 { 16 AuthInfo authrec = new AuthInfo(); 17 authrec.Name = userinfos.Name; 18 authrec.IP = sessioninfos.IP; 19 authrec.Browser = sessioninfos.Browser; 20 authrec.AuthTime = DateTime.Now; 21 authrec.LastAuthTime = DateTime.Now; 22 authrec.LogOffTime = null; 23 24 db.AuthInfo.InsertOnSubmit(authrec); 25 db.SubmitChanges(); 26 return "Authenticate Success!"; 27 } 28 else 29 { 30 return "Authenticate Fail..."; 31 } 32 33 } 34 } 35 //用戶登出 36 public string Logout(SessionInfos sessioninfos) 37 { 38 AuthInfo authrec = new AuthInfo(); 39 authrec = db.AuthInfo.Where(m => m.Browser == sessioninfos.Browser && m.IP == sessioninfos.IP 40 &&(m.LastAuthTime>System.DateTime.Now.AddMinutes(-60)) 41 && m.LogOffTime == null).First(); 42 43 authrec.LogOffTime = DateTime.Now; 44 45 db.SubmitChanges(); 46 return "Logout successed"; 47 48 } 49 //用戶狀態查詢,便于獲取當前用戶的信息 50 public string StateQuery(SessionInfos sessioninfos) 51 { 52 if (db.AuthInfo.Where(m => m.Browser == sessioninfos.Browser && m.IP == sessioninfos.IP 53 && (m.LastAuthTime > System.DateTime.Now.AddMinutes(-60)) 54 &&m.LogOffTime==null).Count() > 0) 55 { 56 AuthInfo authrec = new AuthInfo(); 57 authrec = db.AuthInfo.Where(m => m.Browser == sessioninfos.Browser && m.IP == sessioninfos.IP 58 && (m.LastAuthTime>System.DateTime.Now.AddMinutes(-60)) 59 && m.LogOffTime == null).First(); 60 61 authrec.LastAuthTime = System.DateTime.Now; 62 db.SubmitChanges(); 63 return authrec.Name + ",you has logged in."; 64 } 65 else 66 { 67 return "Please login or register"; 68 } 69 } 70 //用戶權限判定,決定是否授權 71 public bool AuthorityJudge(SessionInfos sessioninfo, Authority authority) 72 { 73 bool flag = false; 74 //抓取當前用戶 75 var authinforec = db.AuthInfo.FirstOrDefault(m => m.IP == sessioninfo.IP && m.Browser == sessioninfo.Browser 76 &&m.LogOffTime==null); 77 //查詢用戶的所有角色 78 var userrolerec = db.UserRole.Where(m => m.UserName == authinforec.Name).ToArray(); 79 //遍歷角色的所有權限,查詢是否存在與請求權限相同的權限 80 for (int i = 0; i < userrolerec.Length;i++ ) 81 { 82 var roleauthorityrec = db.RoleAuthority.FirstOrDefault(m => m.RoleName == userrolerec[i].RoleName 83 && m.ActionName == authority.ActionName && m.ControllerName == authority.ControllerName); 84 //如果用戶對應的角色存在相應權限,則授權 85 if (roleauthorityrec != null) 86 { 87 flag = true; 88 break; 89 } 90 else flag = false; 91 } 92 93 return flag; 94 } 訪問控制功能?
?
?
轉載于:https://www.cnblogs.com/Traveller-Lee/p/5617455.html
總結
以上是生活随笔為你收集整理的WCF技术实现基于角色的访问控制的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Java9都快发布了,Java8的十大新
- 下一篇: 补鞋匠---Cobbler 服务器自动搭
