WCF技术实现基于角色的访问控制
第一次寫,小緊張!
即將畢業(yè)了,現(xiàn)在將我畢業(yè)設(shè)計中用到的小的編程技術(shù)以及自己的一些理解分享出來,希望可以做點小貢獻(xiàn)。
首先要感謝網(wǎng)上各路大神無私的分享,沒有你們,就沒有我的收獲。
在大四之前,對于編程只是學(xué)習(xí)過簡單的C語言,從來沒有接觸過工程實踐。最后的畢業(yè)設(shè)計肯定要開發(fā)程序,于是認(rèn)真學(xué)習(xí)了一段時間。
我的畢業(yè)設(shè)計是開發(fā)一個信息管理系統(tǒng),希望簡單實現(xiàn)對學(xué)生信息的管理。系統(tǒng)的前端決定使用MVC模式(當(dāng)下比較流行,但是好難學(xué)!),后臺的管理用到了WCF技術(shù),體現(xiàn)一種SOA思想。
今天主要講講WCF技術(shù)如何實現(xiàn)基于角色的訪問控制,這里只是涉及基本原理,高手勿噴!
一、基于角色訪問控制原理
(1)用戶
用戶是指系統(tǒng)的使用者,是一個能夠?qū)ο到y(tǒng)進(jìn)行訪問和操作的實體。
(2)角色
角色是整個RBAC模型中的關(guān)鍵,角色是用戶和系統(tǒng)權(quán)限中間的媒介,將用戶和系統(tǒng)權(quán)限相分離,起橋梁及紐帶的作用。角色可以被分配給用戶,進(jìn)而和用戶建立關(guān)聯(lián);角色也可以被分配權(quán)限,進(jìn)而和訪問權(quán)限建立關(guān)聯(lián)。
在實際的系統(tǒng)中,用戶可以根據(jù)需要被分配多個角色,比如一個人既是單位的董事長又是單位的足球隊長;角色也可以根據(jù)需要被分配多個權(quán)限,比如部門經(jīng)理角色可以被分配人事任免權(quán)和決策權(quán)。
(3)權(quán)限
權(quán)限是指系統(tǒng)使用者對系統(tǒng)資源進(jìn)行訪問和操作的能力,在RBAC中,用戶通過被分配相應(yīng)的角色而間接獲得了所需的權(quán)限。
(4)會話
會話在訪問控制中起標(biāo)記作用,用戶和角色通過建立持續(xù)一段時間的會話來進(jìn)行關(guān)聯(lián)。一個用戶在一次操作周期中,可以通過一個會話關(guān)聯(lián)多個不同的角色,當(dāng)然也可以通過多個不同的會話關(guān)聯(lián)更多的角色。而用戶的權(quán)限就是這些關(guān)聯(lián)的角色的權(quán)限之和。
(5)角色等級
角色等級RH(Role Hierarchy)在現(xiàn)實的系統(tǒng)中可以直接體現(xiàn)出使用該系統(tǒng)的企業(yè)或單位的權(quán)力等級和責(zé)任劃分,在程序設(shè)計中也方便通過繼承進(jìn)行授權(quán)。
二、訪問控制服務(wù)功能模塊設(shè)計
該服務(wù)按照功能可以劃分為如下幾個部分:用戶管理模塊、角色管理模塊、授權(quán)管理模塊和權(quán)限判定模塊。
三、授權(quán)管理流程設(shè)計
四、訪問控制流程設(shè)計
五、數(shù)據(jù)庫設(shè)計
下圖是VS中LINQ to SQL類的設(shè)計圖,這個類用于連接SQL Server數(shù)據(jù)庫,好用,推薦!
六、WCF契約設(shè)計
在下文的數(shù)據(jù)契約中,權(quán)限中有Controller和Action兩個變量,這是因為我的這個WCF訪問控制后臺是和MVC前端結(jié)合的,大家在用的時候,需要根據(jù)自己的程序來設(shè)計權(quán)限中的變量。
1 [ServiceContract] 2 public interface IServiceAuthenticate 3 { 4 //用戶注冊,輸入用戶信息和會話信息進(jìn)行用戶注冊 5 [OperationContract] 6 string Register(UserInfos userinfo, SessionInfos sessioninfo); 7 //用戶刪除,輸入用戶信息進(jìn)行用戶刪除 8 [OperationContract] 9 string DeleteUser(UserInfos userinfo); 10 //用戶登錄,輸入用戶信息和會話信息進(jìn)行用戶登錄 11 [OperationContract] 12 string Login(UserInfos userinfo, SessionInfos sessioninfo); 13 //用戶登出,輸入會話信息進(jìn)行用戶登出 14 [OperationContract] 15 string Logout(SessionInfos sessioninfo); 16 //狀態(tài)查詢,輸入會話信息查詢當(dāng)前用戶的登錄和操作狀態(tài) 17 [OperationContract] 18 string StateQuery(SessionInfos sessioninfo); 19 //創(chuàng)建角色,輸入角色信息進(jìn)行角色創(chuàng)建 20 [OperationContract] 21 string CreateRole(Role role); 22 //刪除角色,輸入角色信息進(jìn)行角色刪除 23 [OperationContract] 24 string DeleteRole(Role role); 25 //用戶角色分配,輸入用戶信息和角色信息為用戶分配角色 26 [OperationContract] 27 string CreateUserRole(UserInfos userinfo, Role role); 28 //刪除用戶角色分配,輸入用戶信息和角色信息刪除特定的用戶角色關(guān)系 29 [OperationContract] 30 string DeleteUserRole(UserInfos userinfo, Role role); 31 //角色權(quán)限分配,輸入角色信息和權(quán)限信息為特定角色分配權(quán)限 32 [OperationContract] 33 string CreateRoleAuthority(Role role, Authority authority); 34 //刪除角色權(quán)限分配,輸入角色信息和權(quán)限信息刪除特定的角色權(quán)限關(guān)系 35 [OperationContract] 36 string DeleteRoleAuthority(Role role, Authority authority); 37 //權(quán)限判定,輸入會話信息和權(quán)限信息判定當(dāng)前用戶有無相應(yīng)的權(quán)限 38 [OperationContract] 39 bool AuthorityJudge(SessionInfos sessioninfo, Authority authority); 40 41 } 42 43 //再定義幾個常用的數(shù)據(jù)契約 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 }七、各個功能模塊實現(xiàn)
我在開發(fā)時使用的SQL Server 2016,數(shù)據(jù)庫連接使用的是LINQ to SQL,因此在程序開頭需要定義連接:
UserDataClassesDataContext db = new UserDataClassesDataContext();1、用戶管理功能實現(xiàn)
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、角色管理功能實現(xiàn)
1 //創(chuàng)建角色 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、授權(quán)管理功能實現(xiàn)
1 //創(chuàng)建用戶-角色規(guī)則 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 //再判斷想要添加的規(guī)則是否存在 11 if (db.UserRole.Where(m => m.UserName == userinfo.Name && m.RoleName == role.RoleName).Count() > 0) 12 return "Rule Exist"; 13 else 14 { 15 //寫入想要添加的用戶-角色規(guī)則 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 //根據(jù)權(quán)限繼承原理,將角色的子角色也賦給用戶 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 //刪除用戶-角色規(guī)則 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 //創(chuàng)建角色-權(quán)限規(guī)則 71 public string CreateRoleAuthority(Role role, Authority authority) 72 { 73 //判斷角色是否存在 if(db.RoleInfo.Where(m=>m.RoleName==role.RoleName).Count()>0) 74 { 75 //查詢角色關(guān)聯(lián)的所有規(guī)則,找出是否存在想要添加的規(guī)則 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 //規(guī)則不存在,則添加 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 //刪除角色權(quán)限規(guī)則 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 } 授權(quán)管理功能4、訪問控制功能實現(xiàn)
1 //用戶認(rèn)證 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 //用戶狀態(tài)查詢,便于獲取當(dāng)前用戶的信息 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 //用戶權(quán)限判定,決定是否授權(quán) 71 public bool AuthorityJudge(SessionInfos sessioninfo, Authority authority) 72 { 73 bool flag = false; 74 //抓取當(dāng)前用戶 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 //遍歷角色的所有權(quán)限,查詢是否存在與請求權(quán)限相同的權(quán)限 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 //如果用戶對應(yīng)的角色存在相應(yīng)權(quán)限,則授權(quán) 85 if (roleauthorityrec != null) 86 { 87 flag = true; 88 break; 89 } 90 else flag = false; 91 } 92 93 return flag; 94 } 訪問控制功能?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/Traveller-Lee/p/5617455.html
總結(jié)
以上是生活随笔為你收集整理的WCF技术实现基于角色的访问控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java9都快发布了,Java8的十大新
- 下一篇: 补鞋匠---Cobbler 服务器自动搭