Sicherheit ist überall. Ich nutzte den Feiertag, um Shiros Dokumente zu lesen und Shiros Integration von Spring Boot zu dokumentieren, um Zugriffsrechte auf der Grundlage von Rollen in der Datenbank zu kontrollieren
Einführung
Apache Shiro ist ein leistungsstarkes, flexibles Open -Source -Sicherheitsrahmen. Es übernimmt Authentifizierung, Autorisierung, Unternehmenssitzungsmanagement und Verschlüsselung sauber.
Das obige Bild zeigt die grundlegende Architektur von Shiro
Authentifizierung
Manchmal als "Login" bezeichnet, um zu beweisen, dass der Benutzer der Benutzer selbst ist
Genehmigung
Der Prozess der Zugriffskontrolle bestimmen, "wer" auf "was" zugänglich macht
Sitzungsmanagement
Verwalten Sie benutzerspezifische Sitzungen. In Shiro können Sie feststellen, dass alle Benutzersitzungsinformationen von Shiro gesteuert werden.
Kryptographie (Verschlüsselung)
Verschlüsselungsalgorithmen auf Datenquellen und gleichzeitig sicherstellen und gleichzeitig die Benutzerfreundlichkeit sicherstellen
Start
Umfeld
Spring Boot 1.5.9 MySQL 5.7 Maven 3.5.2 Federdaten JPA Lombok
Abhängigkeiten hinzufügen
Hier werden nur die Haupt -Shiro -Abhängigkeiten angegeben
<Depopenty> <gruppe> org.apache.shiro </Groupid> <artifactId> shiro-rpring-boot-starter </artifactid> <version> 1.4.0-Rc2 </Version> </abhängig>
Konfiguration
Wir brauchen vorerst nur die Benutzertabelle und die Rollentabelle. Durch das Ändern der Konfigurationsdatei im Spring Start wird automatisch eine Datenbanktabelle für uns erstellt
server: port: 8888spring: datasource: driver-class-name: com.mysql.jdbc.Driver username: root password: root url: jdbc:mysql://localhost:3306/shiro?characterEncoding=utf-8&useSSL=false jpa: generate-ddl: true hibernate: ddl-auto: update show-sql: true
juristische Person
Rolle.java
@Data @entityPublic class -Rolle {@id @generatedValue Private Integer ID; private long userId; private String -Rolle;}User.java
@Data @EntityPublic Class User {@id @generatedValue private long id; privater String -Benutzername; privates Zeichenfolgenkennwort;}Reich
Erstellen Sie zunächst die Realm -Klasse, erben Sie von der Autorisierung von Realm und passen Sie unsere eigenen Autorisierungs- und Authentifizierungsmethoden an. Realm ist eine Komponente, die auf Sicherheitsdaten zugreifen kann, die für die Anwendung spezifisch sind, z. B. Benutzer, Rollen und Berechtigungen.
Realm.java
Public Class Realm erweitert die Autorisierung von REALM {@autowired Private UserService UserService; // autorisieren @Override Protected AuthorizationInfo detgetAuthorizationInfo (PrincipalCollection PrincipalCollection) {// Benutzername aus Anmeldeinformationen String userername = (String) SecurityUtils.getSubject (). GetPrincipal (); // Benutzerobjekt basierend auf dem Benutzernamen user user = userService.getUserByUserName (Benutzername); // Abfragen Sie die Rollen der Benutzerliste <rolle> list = roleservice.findbyUserid (user.getId ()); SimpleAuthorizationInfo info = new SimplyAuthorizationInfo (); für (Rolle der Rolle: Liste) {// Geben Sie der Benutzerrolle info.addStringPermission (rollen.getRole ()); } return Info; } // @Override Protected AuthenticationInfo detgetAuthenticationInfo (AuthenticationToken AuthenticationToken) löst die Authentifizierung aus. // Benutzer aus dem Datenbank -User user = userService.getUserByUSERNAME (Benutzername) finden; if (userService.getUserByusername (Benutzername) == NULL) {Neue unbekannte AccountException werfen ("Die entsprechenden Benutzerinformationen wurden in diesem System nicht gefunden."); } SimplyAuthenticationInfo info = new SimplyAuthenticationInfo (user.getUnername (), user.getPassword (), getName ()); Info zurückgeben; }}Shiro -Konfigurationsklasse
Shiroconfig.java
@ConfigurationPublic Class Shiroconfig {@Bean public shirofilterFactoryBean ShirofilterFactoryBean (SecurityManager SecurityManager) {shirofilterfactoryBean sHirofilterFactoryBean = New ShirofilterFactoryBean (); shirofilterFactoryBean.SetSecurityManager (SecurityManager); Karte <string, string> filterchainDefinitionMap = new LinkedHashMap <String, String> (); // Folgendes ist die Filterkette, die die Filterung in der Reihenfolge, also/** die letzte statische Ressource einsetzen muss // FilterchaineDefinitionMap.put ("/favicon.ico", "Anon"); // Websymbol filterchaindefinitionMap.put ("/**", "authc"); shirofilterFactoryBean.SetFilterChaindeFinitionMap (filterchainedefinitionMap); Return ShirofilterFactoryBean; } @Bean public defaultWebSecurityManager SecurityManager () {defaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager (myRealm ()); return defaultWebSecurityManager; } @Bean public myrealm myrealm () {myrealm myrealm = new myrealm (); Myrealm zurückkehren; }}Regler
UserController.java
@ControllerPublic Class UserController {@autowired private userservice userService; @GetMapping ("/") public String index () {return "index"; } @GetMapping ("/login") public string tologin () {return "login"; } @GetMapping ("/admin") public string admin () {return "admin"; } @Postmapping ("/login") public String dologin (String -Benutzername, String -Passwort) {usernamePassWordToken token = new BenutzernamePassWordToken (Benutzername, Passwort); Subjekt = SecurityUtils.getSubject (); try {Subjekt.login (Token); } catch (Ausnahme e) {e.printstacktrace (); } return "Redirect: admin"; } @GetMapping ("/home") public String home () {Subjekt telefonisch = SecurityUtils.getSubject (); try {Betreff.Checkpermission ("admin"); } catch (unautorizedException -Ausnahme) {System.out.println ("keine ausreichenden Berechtigungen"); } zurück "nach Hause"; } @GetMapping ("/logout") public string logout () {return "index"; }}Service
UserService.java
@ServicePublic Class UserService {@autowired private userDao userDao; public user getUserByusername (String -Benutzername) {userDao.findByUnername (Benutzername); } @Requiresroles ("admin") public void send () {System.out.println ("Ich habe jetzt die Rolle admin und kann diese Anweisung ausführen"); }}Schicht anzeigen
admin.html
<! DocType html> <html xmlns: th = "http://www.thymeleaf.org"> <html Lang = "en"/> <kopf> <meta charset = "utf-8"/> <title> Titel </title> </head> <body> <body> <body> <body action = "/login" method "methode" posten " Name = "Benutzername" /> <Eingabe type = "Passwort" name = "password" /> <Eingabe type = "sure" value = "login" /> < /form> < /body> < /html>
home.html
<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><html lang="en"/><head> <meta charset="UTF-8"/> <title>Title</title></head><body>home</body></html>
index.html
<! DocType html> <html xmlns: th = "http://www.thymeleaf.org"> <html Lang = "en"/> <kopf> <meta charset = "utf-8"/> <title> Titel </title> </head> <body> Index <body> Index <a. in </a> </body> </html>
login.html
<! DocType html> <html xmlns: th = "http://www.thymeleaf.org"> <html Lang = "en"/> <kopf> <meta charset = "utf-8"/> <title> Titel </title> </head> <body> <body> <body> <body action = "/login" method "methode" posten " Name = "Benutzername" /> <Eingabe type = "Passwort" name = "password" /> <Eingabe type = "sure" value = "login" /> < /form> < /body> < /html>
Zusammenfassen
Dieser kleine Fall implementiert die Kontrolle des Benutzerzugriffs basierend auf Rollen, von denen der wichtigste Bereich ist, das als "Brücke" oder "Anschluss" zwischen Shiro- und Anwendungssicherheitsdaten fungiert.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.