วิธีรักษาความปลอดภัย Spring Boot ด้วย JWT Authentication and Authorization
สวัสดีผู้เรียน เราจะมาเรียนรู้เกี่ยวกับการปรับใช้ความปลอดภัยของสปริงด้วย spring boot3.0 และ JWT สิ่งนี้มีความต่อเนื่องกับ Spring Security ตอนที่ 1: ลิงก์ที่เราพูดถึงเกี่ยวกับการปรับใช้ตามบทบาทความปลอดภัยของสปริง ในนี้เราจะหารือเกี่ยวกับวิธีการใช้ JWT
JWT (โทเค็นเว็บ JSON) เป็นมาตรฐานสำหรับการแสดงการอ้างสิทธิ์อย่างปลอดภัยระหว่างสองฝ่าย เป็นวิธีที่กะทัดรัดและปลอดภัยต่อ URL ในการแสดงการอ้างสิทธิ์ที่จะโอนระหว่างสองฝ่าย JWT ประกอบด้วยสามส่วน: ส่วนหัว เพย์โหลด และลายเซ็น
![](https://post.nghiatu.com/assets/images/m/max/724/1*kp33MbjrW2tRTVK3qARYVQ.png)
ส่วนหัวประกอบด้วยอัลกอริทึมและประเภทโทเค็น Payload ประกอบด้วยหัวเรื่อง ชื่อ ผู้ออก ตรวจสอบลายเซ็นคือการรวมกันของส่วนหัวที่เข้ารหัส เพย์โหลด และรหัสลับ โทเค็น JWT เป็นการรวมกันของสามสิ่งนี้
Spring Securityสามารถรวมเข้ากับ JWT เพื่อรักษาความปลอดภัยเว็บแอปพลิเคชันโดยการสร้าง แยกวิเคราะห์ และตรวจสอบความถูกต้องของ JWT
![](https://post.nghiatu.com/assets/images/m/max/724/1*mwcQGYxGRt72kLR6qbUWTQ.jpeg)
ต่อไปนี้เป็นภาพรวมของการพิสูจน์ตัวตนและการอนุญาต JWT ในSpring Boot :
- การพิสูจน์ตัวตนผู้ใช้: เมื่อผู้ใช้เข้าสู่ระบบ เซิร์ฟเวอร์จะตรวจสอบข้อมูลประจำตัวของผู้ใช้ เช่น ชื่อผู้ใช้และรหัสผ่าน หากข้อมูลรับรองถูกต้อง เซิร์ฟเวอร์จะสร้าง JWT สำหรับผู้ใช้และส่งกลับไปยังไคลเอนต์
- การสร้าง JWT: เซิร์ฟเวอร์สร้าง JWT โดยการเข้ารหัสข้อมูลประจำตัวของผู้ใช้และข้อมูลที่จำเป็นอื่นๆ เช่น เวลาหมดอายุ ลงในวัตถุ JSON จากนั้นวัตถุ JSON จะได้รับการลงนามโดยใช้คีย์ลับหรือคู่คีย์สาธารณะ/ส่วนตัว
- ที่เก็บโทเค็น: ไคลเอนต์จัดเก็บ JWT ไว้ในเครื่อง โดยปกติจะอยู่ในคุกกี้หรือที่จัดเก็บในตัวเครื่อง
- การอนุญาต: สำหรับแต่ละคำขอที่ตามมา ลูกค้าจะส่ง JWT ในส่วนหัวของคำขอ เซิร์ฟเวอร์ตรวจสอบลายเซ็นของ JWT และถอดรหัสเนื้อหาเพื่อดึงข้อมูลประจำตัวของผู้ใช้และรายละเอียดอื่นๆ จากข้อมูลนี้ เซิร์ฟเวอร์สามารถอนุญาตให้ผู้ใช้เข้าถึงทรัพยากรบางอย่างหรือดำเนินการบางอย่างได้
- การตรวจสอบความถูกต้องของโทเค็น: เซิร์ฟเวอร์ยังสามารถตรวจสอบความถูกต้องของ JWT เพื่อให้แน่ใจว่าไม่ได้ถูกดัดแปลงและไม่หมดอายุ หากโทเค็นไม่ถูกต้อง เซิร์ฟเวอร์สามารถปฏิเสธคำขอหรือขอให้ผู้ใช้เข้าสู่ระบบอีกครั้ง
ขั้นตอนที่ 1: เพิ่มการอ้างอิง JWT
![](https://post.nghiatu.com/assets/images/m/max/724/1*KNxNHRUYCe1qOzI3E9VPZQ.png)
ขั้นตอนที่ 2: สร้างจุดสิ้นสุดเพื่อตรวจสอบสิทธิ์และสร้าง JWT
![](https://post.nghiatu.com/assets/images/m/max/724/1*dyNiRtH7DLrSAvidQfvpjw.png)
![](https://post.nghiatu.com/assets/images/m/max/724/1*Jb3cZ1wuB6kBCwtpsmFiUA.png)
ในเมธอด CreateToken เรากำลังสร้างโทเค็นโดยตั้งค่าการอ้างสิทธิ์ หัวเรื่อง วันที่ออกและวันหมดอายุ ลายเซ็น
ขั้นตอนที่ 3: สร้างตัวกรองเพื่อตรวจสอบ JWT
![](https://post.nghiatu.com/assets/images/m/max/724/1*taDT9V5_JB7I1OqDuN1fDA.png)
สร้างคลาสสำหรับกรองและขยายด้วย OncePerRequestFilter แทนที่เมธอด doFilterInternal และเรียกใช้โทเค็นการให้สิทธิ์จากส่วนหัว ตรวจสอบความถูกต้องของโทเค็นโดยแยกชื่อผู้ใช้และวันหมดอายุออกจากโทเค็น filer นี้ใช้เพื่อตรวจสอบโทเค็น JWT สำหรับการเรียก API แต่ละครั้ง
ขั้นตอนที่ 4: เพิ่มการกำหนดค่าเพื่ออนุญาตการเรียก API
![](https://post.nghiatu.com/assets/images/m/max/724/1*H8Fpj1Zky4KkBE-mXJUxfw.png)
สร้างคลาสและเพิ่มเมธอดในการอนุญาต ในโค้ดด้านบนให้การเข้าถึงจุดสิ้นสุด "/products/new","/products/authenticate" แก่ผู้ใช้ทั้งหมด สำหรับจุดสิ้นสุด "/products/**" เฉพาะผู้ใช้ที่รับรองความถูกต้องด้วย JWT ที่ถูกต้องเท่านั้น เข้าถึง.
การทดสอบการใช้งาน
การรับรองความถูกต้องและสร้างโทเค็น
![](https://post.nghiatu.com/assets/images/m/max/724/1*YPg7kg0oQ2JTs2ZB0dIY8w.png)
คัดลอกโทเค็นที่สร้างขึ้นและเพิ่มลงในการเรียก API อื่น ฉันกำลังเข้าถึง API ด้านล่างด้วยข้อมูลประจำตัวของผู้ดูแลระบบ
![](https://post.nghiatu.com/assets/images/m/max/724/1*5sUY4L-nyjQjGedm2U7KRQ.png)
หากเราพยายามเข้าถึง API ด้วยข้อมูลประจำตัวของผู้ดูแลระบบซึ่งผู้ใช้เท่านั้นที่สามารถเข้าถึงได้จะได้รับข้อผิดพลาด 403 Forbidden
![](https://post.nghiatu.com/assets/images/m/max/724/1*kdZtCs4aTy7URN6XDIRbaQ.png)
![](https://post.nghiatu.com/assets/images/m/max/724/1*XQBMqU9dDsQT_wtwTNb-JQ.png)
หมายเหตุ: หากคุณต้องการโค้ด GitHub ที่ใช้งานได้ โปรดติดตามฉันและแสดงความคิดเห็น ID อีเมลของคุณ ฉันจะส่งลิงค์ซอร์สโค้ดไปยังอีเมลของคุณ
ส่วนที่ 1: การเข้าถึงตามบทบาทของ Spring Security ด้วย Spring Boot
อ้างอิงลิงก์สำหรับ Spring Boot Concepts อื่นๆ:
บทช่วยสอน Spring AOP
บทช่วยสอนการบันทึก Spring Boot
การกำหนดค่าจากส่วนกลางใน Spring Boot
คำอธิบายประกอบไฮเบอร์เนตที่ใช้บ่อยที่สุด