ความปลอดภัยมีอยู่ทั่วไป ฉันใช้ประโยชน์จากวันหยุดเพื่ออ่านเอกสารของ Shiro และเอกสารการรวมของ Shiro ในการบูต Spring เพื่อควบคุมสิทธิ์การเข้าถึงตามบทบาทในฐานข้อมูล
การแนะนำ
Apache Shiro เป็นกรอบความปลอดภัยที่ทรงพลังและยืดหยุ่น มันจัดการการรับรองความถูกต้องการอนุญาตการจัดการเซสชันขององค์กรและการเข้ารหัสอย่างหมดจด
ภาพด้านบนแสดงสถาปัตยกรรมพื้นฐานของ Shiro
การรับรองความถูกต้อง
บางครั้งเรียกว่า "เข้าสู่ระบบ" เพื่อพิสูจน์ว่าผู้ใช้เป็นผู้ใช้เอง
การอนุญาต
กระบวนการควบคุมการเข้าถึงนั่นคือกำหนดว่า "ใคร" เข้าถึง "อะไร"
การจัดการเซสชัน
จัดการเซสชันเฉพาะผู้ใช้ ในชิโร่คุณจะพบว่าข้อมูลเซสชันผู้ใช้ทั้งหมดจะถูกควบคุมโดยชิโร่
การเข้ารหัส (การเข้ารหัส)
อัลกอริทึมการเข้ารหัสบนแหล่งข้อมูลในขณะที่มั่นใจในความสะดวกในการใช้งาน
เริ่ม
สิ่งแวดล้อม
Spring Boot 1.5.9 MySQL 5.7 Maven 3.5.2 Spring Data JPA Lombok
เพิ่มการพึ่งพา
เฉพาะการพึ่งพา Shiro หลักเท่านั้นที่ได้รับที่นี่
<Ederency> <roupId> org.apache.shiro </groupId> <ratifactid> Shiro-Spring-Boot-Starter </artifactid> <version> 1.4.0-RC2 </version>
การกำหนดค่า
เราต้องการเพียงตารางผู้ใช้และตารางบทบาทในขณะนี้ การแก้ไขไฟล์การกำหนดค่าใน Spring Boot จะสร้างตารางฐานข้อมูลโดยอัตโนมัติสำหรับเรา
เซิร์ฟเวอร์: พอร์ต: 8888Spring: DataSource: Driver-Class-Name: com.mysql.jdbc.driver ชื่อผู้ใช้: รูทรหัสผ่าน: รูท URL: JDBC: mysql: // localhost: 3306/shiro?
กิจการ
Role.java
@data @entitypublic class บทบาท {@id @GeneratedValue ID จำนวนเต็มส่วนตัว; ผู้ใช้ยาวส่วนตัว; บทบาทสตริงส่วนตัว}user.java
@data @entitypublic class user {@id @GeneratedValue ส่วนตัว Long ID; ชื่อผู้ใช้สตริงส่วนตัว; รหัสผ่านสตริงส่วนตัว}อาณาจักร
ขั้นแรกให้สร้างคลาส Realm สืบทอดมาจาก AuthorizingRealm และปรับแต่งวิธีการอนุญาตและการรับรองความถูกต้องของเราเอง Realm เป็นส่วนประกอบที่สามารถเข้าถึงข้อมูลความปลอดภัยที่เฉพาะเจาะจงไปยังแอปพลิเคชันเช่นผู้ใช้บทบาทและการอนุญาต
realm.java
Public Class Public Explates AuthorizingRealM {@AutoWired Userservice Userservice; // อนุญาต @Override Protected AuthorizationInfo DogetAuthorizationInfo (principalcollection principalcollection) {// รับชื่อผู้ใช้จากข้อมูลรับรองสตริงชื่อผู้ใช้ = (String) SecurityUtils.getSubject (). getPrincipal (); // วัตถุผู้ใช้แบบสอบถามขึ้นอยู่กับผู้ใช้ชื่อผู้ใช้ผู้ใช้ = userservice.getUserByUserName (ชื่อผู้ใช้); // สอบถามบทบาทที่เป็นเจ้าของโดยรายชื่อผู้ใช้ <role> list = roleservice.findbyUserId (user.getId ()); SimpleAdeArizationInfo Info = ใหม่ SimpleAdeAdizationInfo (); สำหรับ (บทบาทบทบาท: รายการ) {// ให้ข้อมูลผู้ใช้ info.addstringpermission (role.getrole ()); } ส่งคืนข้อมูล; } // Authorize @Override Protected AuthenticationInfo DOGETAUTHENTICATIONINFO (AuthenticationToken AuthenticationToken) พ่น AuthenticationException {// รับชื่อผู้ใช้ของสตริงผู้ใช้ปัจจุบันชื่อผู้ใช้ = (สตริง) AuthenticationToken.getPrincipal (); // การค้นหาผู้ใช้จากผู้ใช้ฐานข้อมูลผู้ใช้ = userservice.getUserByUserName (ชื่อผู้ใช้); if (userservice.getUserByUserName (ชื่อผู้ใช้) == null) {โยน unknownaccountexception ใหม่ ("ข้อมูลผู้ใช้ที่เกี่ยวข้องไม่พบในระบบนี้"); } SimpleAuthenticationInfo info = ใหม่ SimpleAuthenticationInfo (user.getUserName (), user.getPassword (), getName ()); ข้อมูลส่งคืน; -คลาสการกำหนดค่า Shiro
shiroconfig.java
@ConfigurationPublic คลาส shiroconfig {@bean สาธารณะ ShirofilterFactoryBean ShirofilterFactoryBean (SecurityManager SecurityManager) {ShirofilterFactoryBean ShirofilterFactoryBean = New ShirofilterFactoryBean (); ShirofilterFactoryBean.SetSecurityManager (SecurityManager); แผนที่ <สตริง, สตริง> filterChaInDefinitionMap = ใหม่ linkedHashMap <สตริง, สตริง> (); // ต่อไปนี้เป็นห่วงโซ่ตัวกรองการกรองตามลำดับดังนั้น/** จำเป็นต้องใส่ทรัพยากรคงที่สุดท้าย // เปิดตัวกรอง filterchaindefinitionmap.put ("/favicon.ico", "anon"); // เว็บไอคอน FilterChainDefinitionMap.put ("/**", "Authc"); ShirofilterFactoryBean.SetFilterChainDefinitionMap (FilterChainDefinitionMap); ส่งคืน ShirofilterFactoryBean; } @Bean Public DefaultWebsecurityManager SecurityManager () {DefaultWebsecurityManager defaultWebsecurityManager = ใหม่ defaultWebsecurityManager (MyRealm ()); ส่งคืน defaultwebsecurityManager; } @Bean สาธารณะ MyRealm MyRealm () {MyRealm MyRealm = new MyRealm (); กลับ Myrealm; -ผู้ควบคุม
usercontroller.java
@ControllerPublic คลาส UserController {@AutoWired Userservice Userservice; @getMapping ("/") ดัชนีสตริงสาธารณะ () {return "ดัชนี"; } @getMapping ("/ล็อกอิน") สตริงสาธารณะ tologin () {return "เข้าสู่ระบบ"; } @getMapping ("/admin") Public String admin () {return "admin"; } @PostMapping ("/ล็อกอิน") สตริงสาธารณะ dologin (ชื่อผู้ใช้สตริง, รหัสผ่านสตริง) {USERNAMEPASSWORDTOKEN TOKEN = New USERNAMEPASSWORDTOKEN (ชื่อผู้ใช้รหัสผ่าน); หัวเรื่องหัวเรื่อง = securityutils.getSubject (); ลอง {subject.login (โทเค็น); } catch (exception e) {e.printstacktrace (); } return "Redirect: admin"; } @getMapping ("/home") Public String Home () {subject subject = securityUtils.getSubject (); ลอง {subject.checkpermission ("admin"); } catch (ข้อยกเว้นที่ไม่ได้รับอนุญาต exception) {system.out.println ("ไม่มีสิทธิ์เพียงพอ"); } กลับ "บ้าน"; } @getMapping ("/logout") ล็อกอินสตริงสาธารณะ () {return "index"; -บริการ
userservice.java
@ServicePublic คลาส Userservice {@AutoWired UserDao UserDao; ผู้ใช้สาธารณะ getUserByUserName (ชื่อผู้ใช้สตริง) {return userdao.findbyusername (ชื่อผู้ใช้); } @requiresRoles ("ผู้ดูแลระบบ") โมฆะสาธารณะส่ง () {system.out.println ("ตอนนี้ฉันมีผู้ดูแลบทบาทและสามารถดำเนินการข้อความนี้"); -แสดงเลเยอร์
admin.html
<! doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "UTF-8" name = "username" /> <อินพุต type = "รหัสผ่าน" name = "รหัสผ่าน" /> <อินพุต type = "subment" value = "เข้าสู่ระบบ" /> </form> </body> </html>
home.html
<! doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/> <title> title>
index.html
<! doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "utf-8"/> <title> title> ใน </a> </body> </html>
เข้าสู่ระบบ. html
<! doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en"/> <head> <meta charset = "UTF-8" name = "username" /> <อินพุต type = "รหัสผ่าน" name = "รหัสผ่าน" /> <อินพุต type = "subment" value = "เข้าสู่ระบบ" /> </form> </body> </html>
สรุป
กรณีขนาดเล็กนี้ใช้การควบคุมการเข้าถึงผู้ใช้ตามบทบาทที่สำคัญที่สุดคือ Realm ซึ่งทำหน้าที่เป็น "บริดจ์" หรือ "ตัวเชื่อมต่อ" ระหว่าง Shiro และข้อมูลความปลอดภัยของแอปพลิเคชัน
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น