เมื่อเร็ว ๆ นี้ฉันกำลังทำงานในโครงการประเภทเว็บไซต์ที่ต้องมีการควบคุมโมดูลการเข้าถึงของผู้ใช้ (สิทธิ์) ดังนั้นชุดฟังก์ชั่นการควบคุมการอนุญาตอย่างง่ายได้รับการออกแบบและนำไปใช้
1. การออกแบบฐานข้อมูล
ผู้ใช้: ผู้ใช้
โมดูล: โมดูล
รหัส SQL:
/*ประเภทเซิร์ฟเวอร์เป้าหมาย: เซิร์ฟเวอร์ MySQLTARGET เวอร์ชัน: 50628File การเข้ารหัส: 65001DATE: 2016-08-26 10: 35: 28*/ตั้งค่าต่างประเทศ _KEY_CHECKS = 0;------------------------------- null auto_increment, `module` varchar (30) ความคิดเห็น null เริ่มต้น '模块',` pid` int (10) ความคิดเห็นค่าเริ่มต้น null ความคิดเห็น '上一级 id', `ระดับ 'int (4) ความคิดเห็นค่าเริ่มต้น null' 级别 ', คีย์หลัก ------------------------------ โครงสร้างตารางสำหรับ `ผู้ใช้ '----------------------------- ตารางวางถ้ามีอยู่` ผู้ใช้' สร้างตาราง `ผู้ใช้ '(` user_code` varchar (10) ไม่ใช่ความคิดเห็นว่าง' 用户代码 `user_name` varchar (40) ความคิดเห็นเริ่มต้น ความคิดเห็น null 'qq', `msn` varchar (50) ความคิดเห็น null เริ่มต้น 'msn',` demo` varchar (100) ความคิดเห็น null เริ่มต้น '备注', `auth_code` ความคิดเห็นข้อความ '权限码', คีย์หลัก (` user_code`)) engine = innoDb charset = utf8; --------------------------------------------------------
1. การใช้งานแบ็คเอนด์ <br /> เฟรมเวิร์ก SSM+Freemarker ใช้ในโครงการเพื่อห่อหุ้มสิทธิ์ลงในโครงสร้างข้อมูลของแผนผังการอนุญาตจากนั้นแปลงเป็นรูปแบบ JSON
1) เลเยอร์การแสดงผลใช้ ztree tree (setuserauthontree.html)
<! doctype html> <html> <head> <#รวม "Common/res.html"/> <script src = "$ {base.ctx} /js/layer-v2.1/laypage/laypage.js"> href = "$ {base.ctx} /js/layer-v2.1/laypage/skin/laypage.css" rel = "stylesheet" type = "text/css"/> <script src = "$ {base.ctx} /js/layer-v2. สไตล์-> <link href = "$ {base.ctx} /component/ztree/css/ztreestyle/ztreestyle.css" rel = "stylesheet" type = "text/css"/> <script type = "ข้อความ/JavaScript" src = "$ {base.ctx} /component/ztree/js/jquery.ztree.core-3.5.js"> </script> <script type = "text/javascript" src = "$ {base.ctx} type = "text/css">. blue-madison {border: 1px solid #7ca7cc; ชายแดนด้านบน: 0;}. คำบรรยายภาพ {พื้นหลังสี: #578ebe; ขอบด้านล่าง: 0; Padding: 0 10px; มาร์จิ้น-ก้น: 0; สี: #fff;} </style> </head> <body> <div style = "overflow-y: auto; width: 400px; ความสูง: 550px;"> <div id = "ztree"> <ul id = "treedemo"> onclick = "editModle ()"> ตกลง </ปุ่ม> <ปุ่มประเภท = "ปุ่ม" id = "ยกเลิก"> ปิด </button> </div> </div> </div> </div> <script> $ ("เอกสาร") Ready () {$ .ajax ({type: "โพสต์" ข้อมูล: "id": "$ {userId}"}, datatype: "json", ความสำเร็จ: ฟังก์ชั่น (ผลลัพธ์) {ztreeobj = $ .fn.ztree.init ($ ("#treedemo"); // โหลดต้นไม้ var ztreeobj; // สำหรับการใช้งานเชิงลึกโปรดดูเอกสาร API (คำอธิบายโดยละเอียดของการตั้งค่าการตั้งค่า) การตั้งค่า var = {ดู: {// dblclickexpand: เท็จ, showline: จริง, // ทำการเชื่อมต่อระหว่างโหนดจะแสดง}, ตรวจสอบ: {enable: true, // nocheckinherit "n": "ps"}, // autochecktrigger: true}, callback: {oncheck: ztreeoncheck,}}; // ช่องทำเครื่องหมายคลิกฟังก์ชั่นเหตุการณ์การโทรกลับ ZTreeOnCheck (เหตุการณ์, treeId, treenode) { /* var ztree = $ .fn.ztree.getZtreeObj ("treedemo"); var changeNodes = ztree.getChangeCheckedNodes (); สำหรับ (var i = 0; i <condectionnodes.length; i ++) {var treenode = changeNodes [i]; - ฟังก์ชั่น editModle () {var rootid = null; var midid = null; var minid = null; var treeobj = $ .fn.ztree.getZtreeObj ("Treedemo"); var nodes = treeobj.getCheckedNodes (); สำหรับ (var i = 0; i <nodes.length; i ++) {ถ้า (โหนด [i] .level == 0) {rootid = rootid+","+โหนด [i] .id; } if (โหนด [i] .level == 1) {midid = midid+","+โหนด [i] .id; } if (โหนด [i] .level == 2) {minid = minid+","+โหนด [i] .id; }} if (rootId! = null) {rootId = rootId.substring (5, rootid.length); } if (midid! = null) {midid = midid.substring (5, midid.length); } if (minid! = null) {minid = minid.substring (5, minid.length); } $ .ajax ({ประเภท: "โพสต์", url: "$ {base.ctx}/setup/updateUserrightmaskbyajax", ประเภทข้อมูล: "JSON", ข้อมูล: {"rootid": rootid, "midid": midid, "minid": minid, "userid": if (result == "1") {layer.msg ("เพิ่มขีดความสามารถ!"); } // ปิด $ ("#cancel") คลิก (ฟังก์ชัน () {top.dialog.get ("set-dialog"). ปิด (). ลบ ();}); </script> </body> </html> เอฟเฟกต์การแสดงผลมีดังนี้:
2) เลเยอร์ควบคุมคอนโทรลเลอร์ใช้ SpringMVC
ในเลเยอร์ควบคุมให้แปลงข้อมูลเป็นรูปแบบ JSON และส่งไปยังเลเยอร์การแสดงผล
/** * @fun รับสิทธิ์ผู้ใช้สาขา * @author pi feng * @date 2016/8/25 * @param เซสชัน * @param id * @param sutrodorid * @return */@requestmapping ("getuserrightmaskbyid" SUDFOREID = StringUtils.isEmpty (sutterOid)? string.valueof (session.getAttribute ("sutured")): sutteroid; // ตัดสินว่าเป็นโรงแรมหรือรายการอินน์ <แผนที่ <String, Object >> VersionsList = this.setupService.getHotelversions (sutteroid); เวอร์ชันวัตถุ = versionsList.get (0) .get ("เวอร์ชัน"); แผนที่ <String, Object> HotelMap = HashMap ใหม่ <String, Object> (); if ((null! = versionsList) && (versionslist.size ()! = 0)) {// รายการไม่ว่างเปล่าถ้า ("เสร็จสมบูรณ์". เท่าเทียม (เวอร์ชัน)) {// โรงแรม // การสอบถามโรงแรม } อื่นถ้า ("ง่าย" .Equals (เวอร์ชัน)) {// inn // query inn permission tree tree map = this.rightmasservice.getuserrightmaskontree (sutteroid, id, "simple"); }} แผนที่ <string, Object> resultmap = new hashmap <string, object> (); resultmap.put ("datas", hotelmap); return jsonobject.tojsonstring (resultmap, serializerfeature.writemapnullValue); - 3) เลเยอร์บริการบริการห่อหุ้มสิทธิ์ลงในโครงสร้างข้อมูลต้นไม้ที่เป็นไปตามรูปแบบ ztree
/** * @fun รับสิทธิ์ผู้ใช้สาขา * @author pi feng * @date 2016/8/25 * @param sutrowam * @param id * @param เวอร์ชัน * @return map <string, object> */@Override แผนที่สาธารณะ userrightmask = this.irightmaskdao.getuserrightmaskbysubandid (sutteroid, id); รายการ <map <string, object >> listone = new ArrayList <แผนที่ <string, Object >> (); รายการ <map <string, object >> listwo = arrayList ใหม่ <แผนที่ <string, object >> (); // list <map <string, object >>> listthree = arrayList ใหม่ <แผนที่ <สตริง, วัตถุ >> (); รายการ <แผนที่ <สตริงวัตถุ >>> resultList = new ArrayList <แผนที่ <string, Object >> (); if (versions.equals ("เสร็จสมบูรณ์")) {// hotel listone = this.irightmaskdao.getrightmaskonhotelone (); listwo = this.irightmaskdao.getrightmaskonhoteltwo (); // listthree = this.irightmaskdao.getrightmaskonhotelthree (); PackagingTotWotree (รายการผลลัพธ์, listone, listtwo, userrightmask); } else ถ้า (version.equals ("simple")) {// inn listone = this.irightmaskdao.getrightmaskontavernone (); listwo = this.irightmaskdao.getrightmaskontaverntwo (); // listthree = this.irightmaskdao.getrightmaskontavernthree (); PackagingTotWotree (รายการผลลัพธ์, listone, listtwo, userrightmask); } แผนที่ <string, Object> map = new hashmap <string, object> (); map.put ("data", ผลลัพธ์); แผนที่กลับ; }/** * @function ห่อหุ้มต้นไม้ระดับแรก * @author pi feng * @date 2016/8/26 * @param resultslist * @param listone * @param AuthCode * @return void */private packagingToonetRe i = 0; rootmap.put ("id", listone.get (i) .get ("id")); rootmap.put ("ชื่อ", listone.get (i) .get ("โมดูล")); if (validaterightmask (listone, authcode, i)! = -1) {rootmap.put ("ตรวจสอบ", จริง); } else {rootmap.put ("ตรวจสอบ", false); } resultlist.add (rootmap); }}/** * @function ห่อหุ้มต้นไม้รอง * @author pi feng * @date 2016/8/26 * @param resulstlist * @param listone * @param listwo * @param authcode * @return void */private void packagingtotwotree Object >> listwo, แผนที่ <string, Object >> AuthCode) {สำหรับ (int i = 0; i <listone.size (); i ++) {list <map <string, object >> midlist = new ArrayList <แผนที่ <String, Object >> (); สำหรับ (int j = 0; j <listwo.size (); j ++) {ถ้า (listwo.get (j) .get ("pid"). toString () .equals (listone.get (i) .get ("id"). toString ()) แผนที่ <string, Object> midmap = new hashmap <string, object> (); midmap.put ("id", listwo.get (j) .get ("id")); midmap.put ("ชื่อ", listwo.get (j) .get ("โมดูล")); midmap.put ("เด็ก", minlist); if (validaterightmask (ListTwo, AuthCode, j)! = -1) {midmap.put ("ตรวจสอบ", จริง); } else {midmap.put ("ตรวจสอบ", false); } midlist.add (midmap); }} แผนที่ <string, object> rootmap = new hashmap <string, object> (); rootmap.put ("id", listone.get (i) .get ("id")); rootmap.put ("ชื่อ", listone.get (i) .get ("โมดูล")); rootmap.put ("เด็ก", midlist); if (validaterightmask (listone, authcode, i)! = -1) {rootmap.put ("ตรวจสอบ", จริง); } else {rootmap.put ("ตรวจสอบ", false); } resultlist.add (rootmap); }}/** * @function ห่อหุ้มต้นไม้ระดับที่สาม * @author pi feng * @date 2016/8/26 * @param resultlist * @param listone * @param listwo * @param listwo * @param AuthCode * @return Void listone, list <map <string, object >> listwo, รายการ <แผนที่ <string, object >> listthree, แผนที่ <สตริง, วัตถุ> AuthCode) {สำหรับ (int i = 0; i <listone.size (); i ++) {รายการ <แผนที่ <สตริง สำหรับ (int j = 0; j <listwo.size (); j ++) {ถ้า (listwo.get (j) .get ("pid"). toString () .equals (listone.get (i) .get ("id") สำหรับ (int k = 0; k <listthree.size (); k ++) {map <string, object> minmap = new hashmap <string, object> (); if (listthree.get (k) .get ("pid"). toString () .equals (listwo.get (j) .get ("id"). toString ())) {minmap.put ("id", listthree.get (k) .get ("id"); minmap.put ("ชื่อ", listthree.get (k) .get ("โมดูล")); if (validaterightmask (ListThree, AuthCode, K)! = -1) {minmap.put ("ตรวจสอบ", จริง); } else {minmap.put ("ตรวจสอบ", false); } minlist.add (minmap); }} แผนที่ <สตริงวัตถุ> midmap = new hashmap <string, object> (); midmap.put ("id", listwo.get (j) .get ("id")); midmap.put ("ชื่อ", listwo.get (j) .get ("โมดูล")); midmap.put ("เด็ก", minlist); if (validaterightmask (ListTwo, AuthCode, j)! = -1) {midmap.put ("ตรวจสอบ", จริง); } else {midmap.put ("ตรวจสอบ", false); } midlist.add (midmap); }} แผนที่ <string, object> rootmap = new hashmap <string, object> (); rootmap.put ("id", listone.get (i) .get ("id")); rootmap.put ("ชื่อ", listone.get (i) .get ("โมดูล")); rootmap.put ("เด็ก", midlist); if (validaterightmask (listone, authcode, i)! = -1) {rootmap.put ("ตรวจสอบ", จริง); } else {rootmap.put ("ตรวจสอบ", false); } resultlist.add (rootmap); }}/** * @function ตรวจสอบว่ามีรหัสสิทธิ์ใน AuthCode ในรายการ * @author pi feng * @date 2016/8/26 * @param List * @param AuthCode * @param i * @return int */ส่วนตัว AuthCode.get ("auth_code")! = null? AuthCode.get ("auth_code"). toString (): ""; if (! stringutils.isempty (rightmask)) {rightmask = rightmask.replace (";", ","); String [] array = rightmask.split (","); สำหรับ (int j = 0; j <arry.length; j ++) {string arrayrightmask = arry [j]; string listrightmask = list.get (i) .get ("id"). toString (); if (arryrightmask.equals (listrightmask)) {return 1; }}} else {return -1; } return -1; - 4) สอบถามฐานข้อมูลเพื่อรับสิทธิ์ผู้ใช้
. นำระดับการอนุญาตที่แตกต่างจากตารางโมดูลตามระดับการอนุญาตในชั้นข้อมูล
เลือก ID, โมดูล, PID, ระดับจากโมดูลที่ระดับ = '0' เลือก ID, โมดูล, PID, ระดับจากโมดูลที่ระดับ = '1' เลือก ID, โมดูล, PID, ระดับจากโมดูลที่ระดับ = '2'
ข. นำการอนุญาตทั้งหมดของผู้ใช้ (รหัสสิทธิ์) ในตารางผู้ใช้
เลือก auth_code จากผู้ใช้ที่ user_code = 'pifeng'
ค. เมื่อบันทึกการอนุญาตรหัสการอนุญาตระหว่างระดับที่แตกต่างกันจะถูกคั่นด้วยอัฒภาคของอังกฤษ ";" และรหัสการอนุญาตระหว่างระดับเดียวกันจะถูกคั่นด้วยเครื่องหมายจุลภาคของอังกฤษ " ตัวอย่างเช่น: 1,2,3,4,5,6,7,8,8,9,10,11,12; 13,14,15,16,17,18,19,20,21,22,23,24,25,26,36,37,27,28,29,30,31,32,33,34,35,38,39,39,40,41,42,43,42,43, , 45,46,47,48,49,50,51,52,53,54,56,57,58,59,60,61,62,63,64,133,65,66,67,68,69,70,71,71,72,74,75,75,65,65,60,60,60,60,60,60,60,60,61,62,64,64,64,64,64,64,64, 26,127,128,129,130,131,76,77,78,79,80,81,82,83,84,85,86,87,88,99,924,924,924,924,924,93,93,93,93,93,93,93,93,93,93,93, 6,97,98,137,138,139,100,101,102,103,106,107,132,108,109,110,111,112,113,114,115,116,125,117,118,119,119,120,121,125,119,112,112,112,1112,
5) ใช้แท็ก freemarker เพื่อควบคุมว่าโมดูลฟังก์ชันหน้าจะแสดงตามรหัสสิทธิ์ของผู้ใช้
. การกำหนดค่า freemarker ในไฟล์ XML
<bean id = "freemarkerConfig"> <!-เส้นทางการโหลดเทมเพลต-> <ชื่อคุณสมบัติ = "templateLoaderPath"> <dange>/web-inf/ftl/</value> </คุณสมบัติ> <property name = "freeMarkeriBles"> <ap map> name = "freemarkerSettings"> <props> <prop key = "tag_syntax"> auto_detect </prop> <prop key = "template_update_delay"> 0 </prop> <prop key = "default_encoding"> utf-8 </prop> <prop key = "date_format"> yyyy-mm-dd </prop> <prop key = "time_format"> hh: mm: ss </prop> <prop key = "number_format"> 0. ###### 0 </prop> key = "classic_compatible"> true </prop> <!-นำเข้าเทมเพลต FTL โดยอัตโนมัติและใช้นามแฝง "ฐาน" เป็นเนมสเปซ-> <prop key = "auto_import"> inc/spring.ftl เป็นฐาน </prop> </props> name = "คำต่อท้าย" value = ". html"/> <property name = "cache" value = "false"/> <property name = "ViewClass" value = "org.springframework.web.servlet.view.freeMarker.freemarkeriew" ข้อยกเว้น: ไม่สามารถเปิดเผยแอตทริบิวต์เซสชัน 'sutteroid' เนื่องจากโมเดลที่มีอยู่-> <property name = "อนุญาตให้ OvereOverride" value = "true"/> <name property = "expoSerequestattributes" value = "true"/> <property name = pageContext.Request, วิธีการใช้งานหน้า: request.contextPath-> <property name = "requestContextattribute" value = "คำขอ"/> <property name = "attributesMap"> <ap> <!
ข. เขียนคลาสเพื่อสืบทอดคลาส TemplateMethodmodel และใช้วิธีการกำหนดเอง Freemarker เพื่อควบคุมว่าโมดูลหน้าแสดงเข้าสู่ระบบและจัดเก็บรหัสสิทธิ์ของผู้ใช้ไว้ในเซสชันหรือไม่จากนั้นรับอนุญาตจากเซสชัน นี่คือตัวอย่าง:
Menufunction คลาสสาธารณะใช้ templateMethodmodel {@Override วัตถุสาธารณะ exec (รายการ arg0) พ่น templateModelexception {ระดับ int = integer.valueof (arg0.get (0) .toString ()); // ระดับโมดูล int modelid = integer.valueof (arg0.get (1) .toString ()); // โมดูลรหัส int จำนวน = 0; // บันทึกเซสชันว่ารหัสสิทธิ์สำหรับโมดูลนี้ httpservletRequest request = ((servletrequestattributes) requestcontextholder.getRequestattributes ()). getRequest (); httpsession session = request.getSession (); Object O = session.getAttribute ("ข้อมูล"); ถ้า (o == null) ส่งคืนเท็จ; ข้อมูลข้อมูล = (ข้อมูล) o; String AuthCode = info.getUser (). getAuthCode (); // รหัสสิทธิ์ถ้า (AuthCode.Contains (";")) {string [] masks = authCode.split (";"); สตริง [] m = มาสก์ [ระดับ] .split (","); สำหรับ (int i = 0; i <m.length; i ++) {ถ้า (modelid == integer.parseint (m [i])) {++ นับ; } else {count+= 0; }}}} if (count == 0) {return false; } else {return true; - ค. ใช้แท็ก freemarker บนหน้าและควบคุมการแสดงผลของโมดูลจะถูกซ่อนไว้
สองพารามิเตอร์ใน menucall, ครั้งแรกคือระดับโมดูลและที่สองคือ ID โมดูล
ตัวอย่างเช่น:
<#ถ้า menucall (1,122)> <li style = "line-height: 250%"> <a href = "#" id = "booknew"> <i> </i> การจอง </a> </li> </#ถ้า>
ข้างต้นคือการใช้งานทั่วไปของการควบคุมโมดูลการเข้าถึงของผู้ใช้ (สิทธิ์)
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น