Apache Shiro ist ein leistungsstarkes und flexibles Open-Source-Sicherheitsrahmen, das in Unternehmensebene wie Authentifizierung, Autorisierung, Sitzungsmanagement und Verschlüsselung auf feinkörniger Ebene gemeinsame Sicherheitskontrollprozesse übernimmt. Das Hauptziel von Apache Shiro ist die Benutzerfreundlichkeit und das Verständnis. Manchmal kann eine Sicherheitsprozesssteuerung sehr kompliziert sein, was für Entwickler Kopfschmerzen entspricht, dies bedeutet dies jedoch nicht unbedingt. Frameworks sollten die Komplexität so weit wie möglich maskieren und eine kurze und intuitive API aufdecken, wodurch die Arbeit der Entwickler vereinfacht und ihre Anwendungssicherheit gewährleistet wird. Dieses Mal werden wir darüber sprechen, wie Sie Shiro verwenden, um die Berechtigungssteuerung in Spring -Webanwendungen zu implementieren.
Funktion
Apache Shiro ist ein umfassendes Framework für Anwendungssicherheit mit vielen Funktionen. Die folgende Abbildung zeigt die wichtigsten Funktionen in Shiro:
Die Hauptziele von Shiro sind "vier Eckpfeiler der Anwendungssicherheit" - Authentifizierung, Autorisierung, Sitzungsmanagement und Verschlüsselung:
Architektur
Aus ganzheitlicher Sicht hat Shiros Architektur drei Hauptkonzepte: Fach (Subjekt, Benutzer), Security Manager (Security Manager) und Realms (Domain). Die folgende Abbildung beschreibt die Beziehung zwischen diesen Komponenten:
Diese Komponenten können wie folgt verstanden werden:
Datenvorbereitung
In Webanwendungen sind die Hauptsteuerung über Sicherheit Rollen, Ressourcen und Berechtigungen (auf welche Rolle auf die Ressourcen zugreifen kann). Ein Benutzer kann mehrere Rollen spielen, und eine Rolle kann auch auf mehrere Ressourcen zugreifen, dh eine Rolle kann mehreren Berechtigungen entsprechen. Um das Datenbankdesign zu implementieren, müssen wir mindestens 5 Tabellen erstellen: Benutzertabelle, Rollentabelle, Ressourcentabelle, Rollenressource-Tabelle, Benutzerrolle-Tabelle. Die Struktur dieser 5 Tabellen lautet wie folgt:
Benutzertabelle:
| Ausweis | Benutzername | Passwort |
|---|---|---|
| 1 | Zhang San | 123456 |
| 2 | Li Si | 6666666 |
| 3 | Wang Wu | 000000 |
Rollenliste:
| Ausweis | Rolename |
|---|---|
| 1 | Administrator |
| 2 | Manager |
| 3 | Personal |
Ressourcentabelle:
| Ausweis | Resname |
|---|---|
| 1 | /Benutzer/hinzufügen |
| 2 | /Benutzer/löschen |
| 3 | /Compony/Info |
Rollenressource-Tabelle:
| Ausweis | rollen | Rückstände |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 3 |
Benutzerrollentabelle:
| Ausweis | Benutzer-ID | rollen |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
Die entsprechende Pojo -Klasse lautet wie folgt:
/*** Benutzer*/Public Class User {private Integer id; privater String -Benutzername; privates Zeichenfolgenkennwort; // Getter & Setter ...} /*** Rolle*/Public Class Rolle {private String -ID; private String rolename;} /*** Ressource*/Public Class Resource {private String -ID; private String resname;} /*** Rollen-Ressource*/Public Class Roleres {private String-ID; private String rollen; private String Rest;} /*** Benutzerrolle*/Public Class UserRole {private String-ID; private String userID; private String rollen;} Ausführliche Schritte zur Integration von Spring und Shiro finden Sie in meinem Blog "Integration von Apache Shiro in Frühlingsanwendungen". Hier fügen wir hinzu: Sie müssen Shiros Abhängigkeiten im Voraus vorstellen, mvnRepository.com öffnen und nach Shiro suchen. Wir brauchen die ersten drei Abhängigkeiten, nämlich Shiro-Core, Shiro-Web und Shiro-Spring. Wenn Sie das Maven -Projekt als Beispiel übernehmen, fügen Sie die folgenden Abhängigkeiten unter den Knoten <dependencies> in pom.xml hinzu:
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.4.0</version></dependency><dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>1.4.0</version></dependency><dependency> <gruppeID> org.apache.shiro </Groupid> <artifactId> shiro-pring </artifactid> <version> 1.4.0 </Version> </abhängig>
In application-context.xml müssen Sie shiroFilter Bohne wie folgt konfigurieren:
<!-Konfigurieren Sie die Filterfabrikklasse von Shiro, ID-ShiroFilter muss mit den Filtern übereinstimmen, die wir in web.xml-> <bean id = "shirofilter"> <Eigenschaft name = "SecurityManager" Ref = "SecurityManager"/> <!-Login-Seite-> <! name = "successUrl" value = "/index"/> <!-illegaler Zugriff auf gesprungene Seiten-> <Eigenschaft name = "unauthorizedurl" value = "/403"/> <!-Berechtigungskonfiguration-> <Eigenschaftsname = "filterchaindefinition"> <value> <!-statische Ressourcen, auf die ohne Authentifizierung zugegriffen werden kann, und andere URLs und andere URLs--Eins. Für die oben ignorierten Ressourcen müssen alle anderen Ressourcen authentifiziert werden, bevor sie zugegriffen werden können ->/** = authc </value> </property> </bean>
Als nächstes müssen Sie Reich definieren. Custom Realm ist aus der AuthorizingRealm -Klasse integriert:
Die öffentliche Klasse myRealm erweitert die Autorisierung von REALM {@autowired Private UserService UserService; / *** Verifizierungserlaubnis*/ @Override Protected AuthorizationInfo detgetAuthorizationInfo (PrincipalCollection PrincipalCollection) {String loginName = SecurityUtils.getSubject (). GetPrincipal (). ToString (); if (loginName! // Berechtigungsinformationsobjekt, verwendet, um alle Rollen und Berechtigungen des gefundenen User SimpleAuthorizationInfo info = new SimplyAuthorizationInfo () zu speichern; // Benutzerrollesammlung Shirouser Shirouser = (Shirouser) PrincipalCollection.getPrimaryPrincipal (); info.setroles (shirouser.getroles ()); info.addsstringPermissions (shirouser.geturlset ()); Info zurückgeben; } return null; } / ** * Authentifizierungsrückruffunktion, rufen Sie * / Protected AuthenticationInfo detgetAuthenticationInfo (AuthenticationToken Token) {String username = (String) token.getPrincipal (); User user = new user (); sysuser.setusername (Benutzername); Versuchen Sie {list <SySuser> user = userService.findbynames (Benutzer); Liste <String> rolelist = userService.SelectrolenamelistByUserid (user.get (0) .getId ()); if (user.size ()! = 0) {string pwd = user.get (0) .getPassword (); // Nachdem alle Überprüfungen übergeben wurden, geben Sie die Benutzerinformationen in die Sitzungssitzung = Securityutils.getSubject (). GetSession (); Session.SetAttribute ("userSession", users.get (0)); Session.SetAttribute ("userSessionID", user.get (0) .getId ()); Session.setAttribute ("usseroles", org.apache.commons.lang.Stringutils.join (Rolelist, ",")); Neue SimplyAuthenticationInfo zurückgeben (Benutzername, user.get (0) .getPassword ()); } else {// Der Benutzer wurde nicht gefunden, um neue unbekannte AccountException () zu werfen; }} catch (Ausnahme e) {System.out.println (e.getMessage ()); } return null; } /*** Aktualisieren Sie den Cache "Benutzerberechtigungsinformationen". */ public void clearCachedauthorizationInfo (PrincipalCollection Principals) {Super.ClearcachedAuthorizationInfo (Principals); } /*** Aktualisieren Sie den Benutzerinformations -Cache. */ public void clearCachedAuthenticationInfo (PrincipalCollection Principals) {Super.ClearcachedAuthenticationInfo (Principals); } /*** Löschen Sie den Cache "Benutzerberechtigung". */ public void clearAllCachedAuthorizationInfo () {getAuthorizationCache (). Clear (); } /*** Löschen Sie den Benutzerinformations -Cache. */ public void clearAllCachedAuthenticationInfo () {getAuthenticationCache (). Clear (); } / *** Alle Caches löschen* / public void clearCache (PrincipalCollection Principals) {Super.Clearcache (Principals); } / *** Alle Authentifizierung Caches* / public void ClearAllCache () {ClearAllCachedAuthenticationInfo (); ClearAllCachedauthorizationInfo (); }}Definieren Sie schließlich einen Controller für die Benutzeranmeldung, um Benutzeranmeldungsanforderungen zu akzeptieren:
@ControllerPublic Class UserConTroller {/*** Benutzeranmeldung*/@PostMapping ("/login") public String login (@valid -Benutzer, BindingResult BindingResult, recirectTributes recirectattributes) {try {if (Bindingresult.haserrors () {Login "{; } // Verwenden Sie das Berechtigungswerkzeug zur Authentifizierung nach erfolgreichem Anmelden in Successurl, definiert in der Shirofilter Bean SecurityUtils.getSubject (). Login (neuer usernamePassWordToken (user.getUnername (), user.getPassword ()); return "Redirect: Index"; } catch (authenticationException e) {redirectAttributes.addflashAttribute ("meldung", "Fehler -Benutzername oder Kennwort"); return "Redirect: Login"; }}/*** logout*/@getmapping ("/logout") public String logout (redirectTributes recirectTributes) {SecurityUtils.getSubject (). Logout (); return "Redirect: Login"; }}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.