สถานการณ์ที่ใช้โดย AOP ในโครงการจริงคือการจัดการอำนาจส่วนใหญ่การจัดการธุรกรรมการจัดการความปลอดภัยการบันทึกและการดีบัก
ปัญหาเกิดจากการพัฒนาโครงการ
เมื่อเร็ว ๆ นี้จำเป็นต้องมีโมดูลการจัดการการอนุญาตในโครงการ ตามวิธีการของเพื่อนร่วมงานก่อนหน้านี้คือการตัดสินเชิงตรรกะก่อนแต่ละอินเตอร์เฟสในการเรียกเลเยอร์คอนโทรลเลอร์ ไม่มีอะไรผิดปกติกับการทำเช่นนี้ แต่อัตราการทำซ้ำรหัสสูงเกินไปและเป็นแรงงานทางกายภาพ ดังนั้นดังที่ได้กล่าวไว้ในชื่อเรื่องใช้ Spring AOP เพื่อสร้างจุดร่องเพื่อให้ได้การจัดการการอนุญาตของฟังก์ชั่นทั่วไปซึ่งช่วยลดความยืดหยุ่นของการพัฒนาในภายหลังของโครงการ
ไฟล์การใช้งานรหัสและการกำหนดค่าสำหรับการจัดการสิทธิ์
ด้วยระดับต่ำสุดของการปรับเปลี่ยนรหัส AOP จึงเป็นตัวเลือกที่เหมาะอย่างยิ่ง มีการอนุญาตหลายอย่างในโครงการและความซับซ้อนของตรรกะค่อนข้างสูงดังนั้นเราจะดำเนินการทีละขั้นตอน เนื่องจากการอนุญาตเกี่ยวข้องกับการโทรไปยังอินเตอร์เฟสแบ็กเอนด์ผู้เขียนจึงเลือกที่จะทำส่วนในรหัสเลเยอร์คอนโทรลเลอร์และจุดแทนเจนต์เป็นบล็อกวิธีการต่าง ๆ ในคอนโทรลเลอร์ สำหรับการอนุญาตการเข้าถึงทั่วไปเราใช้นิพจน์การดำเนินการเพื่อแยกออก
การใช้สิทธิ์ผู้ดูแลระบบแบบอ่านอย่างเดียวและการเลือกจุดตัด
สำหรับคอนโทรลเลอร์ที่ใช้การยกเว้นทั่วไปผู้เขียนจะใช้การดำเนินการลอจิกนิพจน์การดำเนินการ เนื่องจากผู้ดูแลระบบอ่านอย่างเดียวมีสิทธิ์อ่านทั่วโลกและสำหรับการอนุญาตให้เพิ่มการลบและการแก้ไขผู้เขียนใช้วิธีการเพิ่มการลบและการแก้ไขโดยใช้การตัดจุด ดังนั้นการตั้งชื่อวิธีที่เป็นมาตรฐานจึงมีความสำคัญมากในเวลานี้ สำหรับผู้ดูแลระบบหลายคนที่ประกอบกับผู้ดูแลระบบอย่างเดียวเราสามารถตัดสินพิเศษในรหัส ต่อไปนี้เป็นวิธีการกำหนดค่าไฟล์การกำหนดค่าของ Spring AOP
<bean id = "userspermissionsAdvice" /> <aop: config> <!-กำหนดส่วน-> <aop: iscy id = "uthaspect" ref = "userspermissionsvice"> <!-กำหนดจุดเข้า (กำหนดค่าภายใต้ com.thundersoft.metadata.web. com.thundersoft.metadata.web.controller.*. แก้ไข*(.. )) หรือการดำเนินการ (*com.thundersoft.metadata.web.controller.*. แก้ไข*(.. )) หรือการดำเนินการ (*com.thundersoft.metadata.web.web. com.thundersoft.metadata.web.controller.*. อัปเดต*(.. )) หรือการดำเนินการ (*com.thundersoft.metadata.web.controller.*. แทรก*(.. )) หรือการดำเนินการ (*com.thundersoft.metadata.web.controller.* com.thundersoft.metadata.web.controller.*. ลง*(.. ))))) และ (! การดำเนินการ (*com.thundersoft.metadata.web.controller.findpasswordcontroller.*(.. ) และ! ! การดำเนินการ (* com.thundersoft.metadata.web.controller.homecontroller.* (.. )) และ! การดำเนินการ (* com.thundersoft.metadata.web.controller.userstatuscontroller* (.. ) และ! com.thundersoft.metadata.web.controller.userstatuscontroller.*(.. ))) และ! การดำเนินการ (*com.thundersoft.metadata.web.controller.dashboardcontroller*(.. ) และ! id = "AuthPointCut"/> <!-การดำเนินการก่อนที่วิธีการจะถูกเรียก-> <aop: ก่อนวิธีการ = "อ่านอย่างง่าย" pointcut-ref = "authpointcut"/> </aop: แง่มุม> </aop: config>
การใช้รหัสการจัดการสิทธิ์ผู้ดูแลระบบอ่านอย่างเดียว
ฉันพูดมากข้างต้นและฉันจะไม่พูดเรื่องไร้สาระมากนัก ด้านล่างคือการใช้รหัสส่วนที่ควบคุมการอนุญาตแบบอ่านอย่างเดียวและการอนุญาตสารประกอบต่างๆ
/*** การตัดสินการสกัดกั้น AOP ดำเนินการกับผู้ดูแลระบบอ่านอย่างเดียวและผู้ดูแลระบบของพวกเขา * @param จุดเข้าร่วมจุดเข้า * @throws ioexception * / โมฆะสาธารณะอ่านอย่างเดียว (JoinPoint JoinPoint) พ่น IOException { / ** * รับวิธีการสกัดกั้น */ string methodName = joinpoint.getSignature (). getName (); /*** รับวัตถุที่ถูกสกัดกั้น */ Object Object = JoinPoint.getTarget (); logger.info ("การจัดการสิทธิ์ AOP, ชื่อวิธี" + methodName); httpservletRequest request = ((servletrequestattributes) requestcontextholder.getRequestattributes ()). getRequest (); httpservletResponse response = ((servletrequestattributes) requestcontextholder.getRequestattributes ()). getResponse (); String RoleFlag = getLoginuserInfor.getLoginuserRole (คำขอ); / *** Super Administrator*/ if (PermissionsLabeled.super_admin.equals (RoleFlag)) {return; } / *** คำพิพากษาของผู้ดูแลระบบอ่านอย่างเดียวเพื่อทำการเปลี่ยนแปลงข้อมูลเป็นสิทธิ์* / if (สิทธิ์ (PermissionsLabeled.reader_admin.equals (RoleFlag)) {logger.error ( Response.sendredirect (request.getContextPath () + "/auth/readonly"); } / ** * ผู้ดูแลระบบและเป็นผู้ดูแลระบบอ่านอย่างเดียว, * / if (permissionsLabeled.dept_reader_admin.equals (RoleFlag)) {ถ้า (วัตถุอินสแตนซ์ของแผนก compectontroller) {return; } if (วัตถุอินสแตนซ์ของ userController) {if (methodName.contains ("addadmin")) {response.sendrectirect (request.getContextPath () + "/auth/readonly"); } if (methodName.contains ("deleteAdmin")) {response.sendredirect (request.getContextPath () + "/auth/readonly"); } if (methodName.contains ("updateAdmin")) {response.sendredirect (request.getContextPath () + "/auth/readonly"); } if (methodName.contains ("updateAdmin")) {response.sendredirect (request.getContextPath () + "/auth/readonly"); } if (methodName.contains ("updateAdmin")) {response.sendredirect (request.getContextPath () + "/auth/readonly"); } กลับ; } if (Object Instanceof GroupController) {return; } logger.error ("ผู้ดูแลระบบและไม่มีสิทธิ์การดำเนินงานสำหรับผู้ดูแลระบบอ่านอย่างเดียว!"); Response.sendredirect (request.getContextPath () + "/auth/readonly"); } / *** ผู้ดูแลระบบแอปพลิเคชันและผู้ดูแลระบบอ่านอย่างเดียว* / if (PermissionsLabeled.app_reader_admin.equals (RoleFlag)) {ถ้า (วัตถุอินสแตนซ์ของ AppController) {return; } if (วัตถุอินสแตนซ์ของ AppPolicyController) {return; } logger.error ("ผู้ดูแลระบบแอปพลิเคชันและไม่มีสิทธิ์การดำเนินการสำหรับผู้ดูแลระบบอ่านอย่างเดียว!"); Response.sendredirect (request.getContextPath () + "/auth/readonly"); } / *** ผู้ดูแลแผนกและผู้ดูแลระบบแอปพลิเคชันและผู้ดูแลระบบอ่านอย่างเดียว* / ถ้า (PermissionsLabeled.dept_app_reader_admin.equals (RoleFlag)) {ถ้า (วัตถุอินสแตนซ์ของแผนก controller) {return; } if (วัตถุอินสแตนซ์ของ userController) {return; } if (Object Instanceof GroupController) {return; } if (วัตถุอินสแตนซ์ของ AppController) {return; } if (วัตถุอินสแตนซ์ของ AppPolicyController) {return; } logger.error ("ผู้ดูแลระบบและผู้ดูแลระบบแอปพลิเคชันและผู้ดูแลระบบอ่านอย่างเดียวไม่มีสิทธิ์การดำเนินการ"); Response.sendredirect (request.getContextPath () + "/auth/readonly"); -การเลือกจุดตัดด้วยการควบคุมสิทธิ์ผู้ดูแลระบบเฉพาะ
เนื่องจากเป็นเรื่องพิเศษที่จะมีสิทธิ์ผู้ดูแลระบบพิเศษผู้เขียนจึงใช้คอนโทรลเลอร์นอกเหนือจากสิทธิ์การเข้าถึงทั่วไป ในสถานการณ์พิเศษสามารถนำไปใช้ใน Code Logic รหัสไฟล์การกำหนดค่ามีดังนี้:
<AOP: config> <!-กำหนดส่วน-> <aop: iscy id = "authaspect" ref = "userspermissionsadvice"> <!-กำหนดจุดเริ่มต้น (กำหนดค่าภายใต้ com.thundersoft.metadata.web.controller ถูกสกัดกั้นก่อนที่จะถูกเรียก) com.thundersoft.metadata.web.controller.*.*(.. )) และ (! การดำเนินการ (*com.thundersoft.metadata.web.controller.findpasswordcontroller.*(.. ) และ! com.thundersoft.metadata.web.controller.selfserviceController.*(.. )) และ! การดำเนินการ (*com.thundersoft.metadata.web.controller.homecontroller*(.. ) และ! ! การดำเนินการ (* com.thundersoft.metadata.web.controller.dashboardcontroller.* (.. ))) และ! การดำเนินการ (* com.thundersoft.metadata.web.controller.dashboardcontroller* (.. )) com.thundersoft.metadata.web.controller.maincontroller.*(.. )))) "id =" appauthpointcut "/> <!-ดำเนินการก่อนที่วิธีการถูกเรียก-> <aop: ก่อนวิธี =" appdeptauth "pointcut-ref =" appauthpoint
## การใช้รหัสที่อยู่ของการจัดการสิทธิ์
/*** ทำการตัดสินการสกัดกั้นโดยพลการเกี่ยวกับผู้ดูแลระบบแอปพลิเคชันและผู้ดูแลแผนก * @param จุดเข้าร่วมจุดเข้า * @throws ioexception * / โมฆะสาธารณะ AppDeptauth (JoinPoint JoinPoint) พ่น IOException { / ** * รับวิธีการสกัดกั้น */ string methodName = joinpoint.getSignature (). getName (); /*** รับวัตถุที่ถูกสกัดกั้น */ Object Object = JoinPoint.getTarget (); logger.info ("การจัดการสิทธิ์ AOP, ชื่อวิธี", MethodName); httpservletRequest request = ((servletrequestattributes) requestcontextholder.getRequestattributes ()). getRequest (); httpservletResponse response = ((servletrequestattributes) requestcontextholder.getRequestattributes ()). getResponse (); String RoleFlag = getLoginuserInfor.getLoginuserRole (คำขอ); / *** Super Administrator*/ if (PermissionsLabeled.super_admin.equals (RoleFlag)) {return; } / *** คำพิพากษาของผู้ดูแลระบบแอปพลิเคชันเพื่อทำการเปลี่ยนแปลงข้อมูลการอนุญาต* / if (permissionsLabeled.app_admin.equals (RoleFlag)) {ถ้า (วัตถุอินสแตนซ์ของ AppController) {return; } if (วัตถุอินสแตนซ์ของ AppPolicyController) {return; } logger.error ("ผู้ดูแลระบบแอปพลิเคชันไม่มีสิทธิ์ในการดำเนินการ"); Response.sendredirect (request.getContextPath () + "/auth/readonly"); } อื่นถ้า (permissionslabeled.dept_admin.equals (roleflag)) {ถ้า (วัตถุอินสแตนซ์ของแผนก contempontroller) {return; } if (วัตถุอินสแตนซ์ของ userController) {return; } if (Object Instanceof GroupController) {return; } if ("getAllDepartments" .equals (methodName)) {return; } logger.error ("ผู้ดูแลระบบแอปพลิเคชันไม่มีสิทธิ์ในการดำเนินการ"); Response.sendredirect (request.getContextPath () + "/auth/readonly"); } else {return; -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น