เมื่อเร็ว ๆ นี้ฉันกำลังทำงานในโครงการแอพ ฉันพัฒนามันเพียงลำพังในพื้นหลัง ฟังก์ชั่นพื้นฐานของการเข้าสู่ระบบการลงทะเบียนและการตรวจสอบการอนุญาตไม่รวมอยู่ในขั้นตอนแรกของการพัฒนาในลำดับของงานพัฒนา ตอนนี้ฟังก์ชั่นที่เกี่ยวข้องกับธุรกิจบางอย่างเสร็จสมบูรณ์ แต่พอร์ทัลผู้ใช้ยังไม่ได้ใช้งาน นี่แสดงให้เห็นว่าฉันกังวลเกินไปเมื่อฉันวิเคราะห์ข้อกำหนดครั้งแรกและวางพอร์ทัลผู้ใช้ขั้นพื้นฐานที่สุดไว้ข้างหลัง
ตอนนี้คุณต้องเพิ่มฟังก์ชั่นการเข้าสู่ระบบของผู้ใช้และการตรวจสอบสิทธิ์ตามรหัสที่มีอยู่
เกี่ยวกับการเข้าสู่ระบบและการตรวจสอบการอนุญาตอ้างอิงถึงประสบการณ์การพัฒนา iOS ก่อนหน้านี้ด้านแอพให้ชื่อผู้ใช้และรหัสผ่านเพื่อแลกเปลี่ยนโทเค็นและการอนุญาตให้เข้าสู่ระบบเป็นสิ่งจำเป็นสำหรับการร้องขอแต่ละครั้งผ่านโทเค็นแลกเปลี่ยน
ในทางกลับกันฉันต้องพิจารณาปัญหาต่อไปนี้:
1. จะตอบสนองการใช้งานฟังก์ชั่นเหล่านี้ได้อย่างง่ายดายในรหัสของฟังก์ชั่นที่มีอยู่เพื่อให้รหัสที่มีอยู่ไม่เปลี่ยนแปลงมากนักและจะไม่มีความยุ่งยากในการตรวจสอบการอนุญาตในอนาคต
2. วิธีการสร้างโทเค็นตามชื่อผู้ใช้และรหัสผ่านและวิธีการแยกแยะความถูกต้องของลูกค้าที่ให้โทเค็นในฟังก์ชั่นที่ต้องได้รับอนุญาต
ก่อนอื่นต้องเผชิญกับปัญหาแรกตามประสบการณ์การแก้ปัญหาทั่วไปคือตัวกรองและตัวดักจับ หากการตรวจสอบการเข้าสู่ระบบและการอนุญาตถูกวางไว้ในการจัดเรียงข้อกำหนดตราบใดที่ URL ของฟังก์ชั่นในภายหลังจะได้รับรูปแบบที่แน่นอนการใช้ตัวกรองหรือตัวดักจับจะประสบความสำเร็จ แต่ตอนนี้ฉันกำลังเผชิญหน้ากับ URL ที่ไม่มีการออกแบบหรือข้อกำหนดในระยะแรกดังนั้นฉันไม่ต้องการเผชิญหน้ากับตัวกรองหรือตัวดักจับ
นอกเหนือจากการแก้ปัญหาทั่วไปข้างต้นสปริง AOP ได้กลายเป็นอาวุธในการแก้ปัญหาประเภทนี้ มันใช้การเขียนโปรแกรมแบบใบหน้าเพื่อให้การแสดงล่วงหน้าสำหรับวิธีการทั้งหมดที่ต้องการการตรวจสอบการอนุญาต อย่างไรก็ตามเนื่องจาก URL ชื่อคลาสหรือวิธีการไม่ปกติฉันจึงนึกถึงคำอธิบายประกอบที่กำหนดเองและตรวจสอบสิทธิ์สำหรับวิธีการทั้งหมดที่เพิ่มคำอธิบายประกอบที่กำหนดเอง
1. เนื่องจากคุณได้คิดว่าจะใช้ Spring AOP แล้วขั้นตอนแรกคือการเปิดใช้งาน AOP ในไฟล์การกำหนดค่าสปริง
// เปิด AOP
<AOP: ASPECTJ-AUTOPROXY />>>
การกำหนดค่าข้างต้นจะขึ้นอยู่กับการเทแพ็คเกจ JAR ที่เกี่ยวข้องกับสปริงที่เกี่ยวข้องกับโครงการและแนะนำ URL ของ AOP ในส่วนหัวไฟล์การกำหนดค่า
2. ถัดไปให้กำหนดคำอธิบายประกอบที่กำหนดเองก่อน
@Target ({ElementType.Method, ElementType.type}) @Retention (RetentionPolicy.runtime) Public @Interface UserAccess {}3. เราไม่สามารถรีบทำฟังก์ชั่นการตรวจสอบการอนุญาตเพราะโทเค็นของเรายังไม่ได้สร้างวิธีแก้ปัญหา
เพื่อการสร้างโทเค็นการลงชื่อเข้าใช้เดียวจะถูกพิจารณาดังนั้นโทเค็นจึงไม่สามารถแก้ไขได้ตลอดเวลา มิฉะนั้นในเวลาใดก็ได้ตราบใดที่คุณมีโทเค็นอย่างน้อยสองคนสามารถใช้บัญชีเดียวกันในเวลาเดียวกันซึ่งไม่ได้รับอนุญาตในธุรกิจของเราในปัจจุบัน ในท้ายที่สุดฉันเลือก "ชื่อผู้ใช้ + รหัสผ่าน + เวลาเข้าสู่ระบบ" เพื่อทำการเข้ารหัส MD5 เป็นโทเค็น (มีหลายวิธีเช่น UUID เมื่อสร้างความมั่นใจว่าเป็นเอกลักษณ์และความไม่แน่นอน) สร้างโทเค็นเมื่อชื่อผู้ใช้และรหัสผ่านได้รับการตรวจสอบเรียบร้อยแล้วและบันทึกโทเค็นในรูปแบบของคู่คีย์-ค่าของ "ชื่อผู้ใช้: โทเค็น" และ "โทเค็น: ผู้ใช้" (สามารถบันทึกลงในฐานข้อมูล) และในที่สุดก็ส่งคืนโทเค็นให้กับลูกค้า
รหัสต่อไปนี้เป็นเพียงตัวอย่างง่ายๆ:
@ServicePublic คลาส loginService {/*** store "ชื่อผู้ใช้: โทเค็น" คู่คีย์-ค่าคู่*/แผนที่สาธารณะคงที่ <สตริง, สตริง> tokenMap = ใหม่แฮชแมป <สตริง, สตริง> ();/*** ร้านค้า ล็อกอินสตริงสาธารณะ (ชื่อสตริง, รหัสผ่านสตริง) {system.out.println (ชื่อ+"-----"+รหัสผ่าน);/*** ตรวจสอบว่าการเข้าสู่ระบบสำเร็จ* 1. เข้าสู่ระบบสำเร็จ* 1.1 สร้างโทเค็นที่สอดคล้องกันได้สำเร็จและอัปเดต * 1.2 โยนข้อยกเว้นถ้ามันล้มเหลว*/สตริงโทเค็น = tokenMap.get (ชื่อ); ผู้ใช้ผู้ใช้ = null; ถ้า (โทเค็น == null) {user = ผู้ใช้ใหม่ (); user.setName (ชื่อ); user.setPassword (รหัสผ่าน); system.out.println ("ผู้ใช้ใหม่ใหม่ เข้าสู่ระบบ ");} else {user = logginusermap.get (โทเค็น); logginusermap.remove (โทเค็น); system.out.println (" อัปเดตโทเค็นเข้าสู่ระบบของผู้ใช้ "); token = md5util.md5 (ชื่อ+รหัสผ่าน โทเค็น); system.out.println ("ปัจจุบัน"+tokenmap.size ()+"ผู้ใช้"); สำหรับ (ผู้ใช้ U: logginusermap.values ()) {system.out.println (u.getName ()+":"4. ในเวลาเดียวกันลูกค้าของเราได้รับโทเค็นหลังจากเข้าสู่ระบบตราบใดที่เรามีโทเค็นในคำขอทั้งหมดที่ต้องได้รับอนุญาตเราจะได้รับการตอบกลับ (คำแนะนำ: เพื่ออำนวยความสะดวกในการเข้ารหัสแอพ ฉันเพิ่งพบวิธีการทดลอง:
@controller@requestmapping ("/login") คลาสสาธารณะ LoginController {@autowiredPrivate loginService loginService; @useraccess @requestmapping (value = "/loginin", method = requestMethod.get) สาธารณะ @ResponseBody สตริงเข้าสู่ระบบ (คำขอ httpservletRequest) {ชื่อสตริง = request.getParameter ("name"); String password.โปรดทราบว่าส่วนที่เป็นตัวหนาคือการปรับแต่งคำอธิบายประกอบ เป็นไปไม่ได้ที่จะมีโทเค็นสำหรับพารามิเตอร์การร้องขอของฟังก์ชันการเข้าสู่ระบบดังนั้นไม่ว่าจะมีการตรวจสอบกี่ครั้งก็ตาม เพียงแค่ทำตัวอย่าง @UserAccess เพิ่มเฉพาะการทำงานที่ต้องมีการตรวจสอบการอนุญาต
5. คำอธิบายประกอบที่กำหนดเองตอนนี้เป็นจุดเริ่มต้นที่ดี
@component@permissionpublic คลาส permissionaspect {// ตั้งค่าคำอธิบายประกอบที่กำหนดเองเป็นจุดเริ่มต้น @Before ("@annotation (com.example.chap01.annotation.useraccess)") โมฆะสาธารณะ joinpoint.getArgs (); httpservletRequest request = (httpservletrequest) args [0]; สตริงโทเค็น = request.getParameter ("โทเค็น"); System.out.println ("โทเค็นการแจ้งเตือนล่วงหน้า:"+โทเค็น); user = loginService.loginusermap.get (โทเค็น); ถ้า (user == null) {system.out.println ("การตรวจสอบไม่ผ่าน!"); โยนข้อยกเว้นใหม่ ("ไม่มีสิทธิ์");}}}}}}}}ณ จุดนี้ฟังก์ชั่นการเข้าสู่ระบบและการตรวจสอบการอนุญาตจะเสร็จสมบูรณ์ทั้งหมด
นอกจากนี้ซอร์สโค้ดใน GitHub ส่วนบุคคลยังแนบ: https://github.com/zw201913/applogin.git
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน