Shiro
Apache Shiro ist ein leichter Authentifizierungs- und Autorisierungs -Framework. Im Vergleich zur Frühlingssicherheit ist es einfach und einfach zu bedienen und hat eine hohe Flexibilität. Springboot selbst unterstützt die Sicherheit, schließlich ist es sein eigenes Ding. Springboot integriert Shiro vorerst nicht, also müssen Sie es selbst anpassen.
1. Fügen Sie Abhängigkeiten hinzu
<Depepentcy> <GroupID> org.apache.shiro </GroupId> <artifactId> shiro-ring </artifactId> <version> 1.2.5 </Version> </abhängig> <Depopentcy> <gruppe.
2. Schreiben Sie Shiro -Konfigurationsklasse
Paket com.xbz.web.system.config; import at.pollux.thymeleaf.shiro.dialect.shirodialect; import org.apache.shiro.authc.credential.credentialsMatcher; import org.apache.shiro.authc.credential.hashedcredentialsMatcher; import org.apache.shiro.cache.ehcache.ehcacheManager; import org.apache.shiro.codec.base64; import org.apache.shiro.session.sessionListener; import org.apache.shiro.session.mgt.sessionManager; import org.apache.shiro.session.mgt.eis.memorySessiondao; import org.apache.shiro.session.mgt.eis.sessiondao; import org.apache.shiro.spring.lifecycleBeanPostProcessor; import org.apache.shiro.spring.security.interceptor.authorizationAttributesourceadvisor; import org.apache.shiro.spring.web.shirofilterfactoryBean; import org.apache.shiro.web.mgt.cookierememberMeManager; import org.apache.shiro.web.mgt.defaultwebSecurityManager; import org.apache.shiro.web.servlet.simplecookie; import org.apache.shiro.web.session.mgt.DefaultwebSessionManager; import org.springframework.aop.framework.autoproxy.DefaultAdvisorautoproxyCreator; import org.springframework.boot.autoconfigure.condition.condition.Conditionalonmissingbean; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.context.annotation.dependson; Import Java.util.ArrayList; Import Java.util.Collection; import Java.util.linkedhashMap; import Java.util.map; /*** Shiro -Konfigurationsklasse* Apacheshiro Core implementiert die Berechtigungsregelung und -abhingehörigkeit über den Filter, genau wie SpringMVC verwendet DiachServlet, um die Anforderungsverteilung zu steuern. * Da es Filter verwendet, dh die Filter- und Berechtigungsüberprüfung durch URL -Regeln, müssen wir eine Reihe von Regeln und Zugriffsrechten über URLs definieren* / @Configuration Public Class Shirokonfiguration { / *** DefaultDvisorautoproxycreator, eine Bean von Spring, und Advisor entscheidet, welche Klassen von Methoden zu AP -Profi -Profi -Profi -Profi -Bohnen sind. */ @Bean @ConditionalonmissingBean Public DefaultAdvisorAutoproxyCreator DefaultAdSorAutoproxyCreator () {DefaultAdvisorautoproxyCreator defaultaap = new DefaultAdvisorautoproxyCreator (); defaultaap.setProxytargetClass (true); Rückgabe von defaultaap; } /*** shirofilterFactoryBean: Um Shirofilter zu generieren, handeln Sie Abfangen von Ressourcendateien. * Es führt hauptsächlich drei Datenelemente, SecurityManager, Filter und FilterchaineDefinitionManager. * Hinweis: Eine einzelne ShirofilterFactoryBean -Konfiguration ist oder meldet einen Fehler, da bei der Initialisierung der Shirofilterfaktorikbean die Beschreibung des SecurityManagers erforderlich ist. Rollen * */ @bean public shirofilterFactoryBean shirofilterFactoryBean () {shirofilterFactoryBean shirofilterFactoryBean = new ShirofilterFactoryBean (); shirofilterfactoryBean.SetSecurityManager (SecurityManager ()); shirofilterfactoryBean.setLoginurl ("/login"); // Setzen Sie die Seite login.jsp nicht unter dem Root -Verzeichnis des Webprojekts ShirofilterFactoryBean.SetsuSuCcessurl ("/Index"); // Die Verbindung zum Springen nach Login ist erfolgreich ShirofilterfactoryBean.setunaiTory/setunaUnaiuthoridorusiveuri: "/403"/403 ". sprung/* // benutzerdefinierte Interceptor, Einstellungen für mehrere Filter* // map <String, Filter> filter = new LinkedHasMap <> (); // LogoutFilter logoutFilter = new LogoutFilter (); // Begrenzen Sie gleichzeitig die Anzahl der Online -Nummern desselben Kontos. oder einzelne Signal-On usw. // logoutFilter.setRectIRecturl ("/login"); // filters.put ("logout", null); // shirofilterFactoryBean.setFilters (Filter); Karte <String, String> filterchainDefinitionMap = new LinkedHashMap <> (); // filterchaineDefinitionManager muss ein linkedHasMap sein, da es sicherstellen muss, dass ordnungsgemäß filterchainedefinitionmap.put ("/CSS/**", "Anon"); // Statische Ressourcen erfordern keine Berechtigungen, wenn in anderen Verzeichnissen (z. B. JS, IMG usw.) und FilterchaineDefinitionMap.put ("/", "Anon") Dateien vorhanden sind. filterchainedefinitionmap.put ("/login", "anon"); // Konfigurieren Sie den Teil der URL -FilterchaindeFinitionMap.put ("/logout", "logout"); filterchainedefinitionmap.put ("/user/**", "authc, rollen [rollen_user]"); // Der Benutzer spielt eine Rolle. Die Benutzerrolle steuert das Benutzerverhalten. filterchainedefinitionmap.put ("/Ereignisse/**", "Authc, Rollen [rollen_admin]"); // filterchaineDefinitionMap.put ("/user/edit/**", "Authc, Perms [Benutzer: Bearbeiten]"); // Zum Testen wird der tote Wert festgelegt und kann auch aus der Datenbank oder anderen Konfigurationen gelesen werden. Hier werden die Berechtigungen verwendet, um die FilterchaindefinitionMap.put ("/**", "authc") zu steuern. // Ressourcen, die angemeldet werden müssen, im Allgemeinen an der unteren Shirofilterfaktorik. Return ShirofilterFactoryBean; } //region cookies and Session // ========================== Cookie and Session Management begin ========================= private static final String COOKIE_NAME = "rememberMe"; /** Cookie -Objektverwaltung*/public simimecookie remmMecookie () {// Dieser Parameter ist der Name des Cookies, der dem Namen des Kontrollkästchens am vorderen Ende = remmme SimpleCookie SimplyeCookie = new SimpleCookie (Cookie_Name) entspricht; Simplycookie.SetMaxage (604800); // Denken Sie daran, mein Keks wird 7 Tage lang in Kraft gesetzt, und das Gerät wird simplecookie zurückgegeben. } / ** Cookie -Management -Objekt: Erinnere mich an mich. cookierememberMeManager.setcookie (reminreMecookie ()); cookierememberMeManager.setCipherkey (Base64.Decode ("3AVVHMFLUS0KTA3KPRSDAG =="); // Rememberme Cookie -Verschlüsselungsschlüssel schlägt vor, dass jedes Element eine unterschiedliche Standard -AES -Algorithmus -Schlüssellänge (128 256 512 Bits) zurückgibt, die CookierememberMemberManManManManager zurückgeben; } @Bean SessionDAO SessionDaO () {return New MemalsesionDao (); } @Bean public SessionManager SessionManager () {defaultWebSessionManager SessionManager = new defaultWebSessionManager (); Sammlung <SesionListener> Listener = new ArrayList <> (); listeners.add (new BdSessionListener ()); SessionManager.SetSessionListeners (Hörer); SessionManager.SetSessionDao (Sessiondao ()); Rückkehr SessionManager; } // ====================================================== /Endregion /*** SecurityManager: Core Security Transaction Manager, Berechtigungsverwaltung* Diese Klasse kombiniert Login, Login, Berechtigungen und Sitzungsverarbeitung. Es ist eine relativ wichtige Klasse. */ @Bean (name = "SecurityManager") public defaultWebSecurityManager SecurityManager () {defaultWebSecurityManager SecurityManager = new DefaultWebSecurityManager (); SecurityManager.SetRealm (shirorealm ()); SecurityManager.SetCacheManager (EhCacheManager ()); ///// User Authorization/Authentifizierungsinformations -Cache unter Verwendung von EHCACHE Cache // benutzerdefinierte Sitzungsverwaltung verwendet Redis SecurityManager.SetSessionManager (SessionManager ()); // Injize erinnere an meinen Manager; SecurityManager.SetRememberMeManager (rememberMeanager ()); Sicherheitsmanager zurückgeben; } /** * shirorealm, dies ist eine benutzerdefinierte Authentifizierungsklasse, die von der Autorisierung von REALM, * verantwortlich für die Benutzerauthentifizierung und Berechtigungsverarbeitung verantwortlich ist. */ @Bean @Dependson ("LifeCycleBeanPostProcessor") public Shirorealm Shirorealm (AnmeldeinformationenMatcher -Matcher) {shirorealm realm = new shirorealm (); Real.SetCredentialsMatcher (Match); // Passwortüberprüfung implementiert Return Realm; } /*** EHCACHEMANAGER, CACHEMANATER* Nachdem sich der Benutzer erfolgreich angemeldet hat, zwischen den Benutzerinformationen und Berechtigungsinformationen zwischengewertet und dann jedes Mal, wenn der Benutzer anfordert, in die Sitzung des Benutzers einfügen. Wenn diese Bean nicht festgelegt ist, wird die Datenbank für jede Anfrage einmal abgefragt. */ @Bean @Dependson ("LifeCycleBeanPostProcessor") public EhCACHEMANATER EHCACHEMANAGER () {EHCACHEMANATE EM = new EhCacheManager (); em.setCacheManAGerConFigFile ("ClassPath: config/ehcache.xml"); // Konfigurationsdateipfad return EM; } /** * LifecycleBeanPostProcessor, dies ist eine Unterklasse von ZerstörungsawarebeanPostPostProcessor, * ist für den Lebenszyklus von org.apache.shiro.util.initializable Typ Bean verantwortlich. * ist hauptsächlich eine Unterklasse der Autorisierung der REALM -Klasse sowie der EhCacheManager -Klasse. */ @Bean (name = "LifeCycleBeanPostProcessor") public LifecycleBeanPostPostProcessor LifecycleBeanPostProcessor () {Return New LifecycleBeanPostProcessor (); } /** * HashedcredentialsMatcher, diese Klasse dient zum Codieren des Kennworts. * Verhindern, dass die Kennwörter in der Datenbank klar gespeichert werden. Natürlich ist diese Klasse bei der Anmeldung zur Authentifizierung auch für die Codierung der in Form des Formulars geschlossenen Kennwörter verantwortlich. CredentialsMatcher = new HashedcredentialsMatcher (); AnmeldeinformationenMatcher.sethashalgorithmName ("MD5"); // Geben Sie die Verschlüsselungsmethode an, und Sie können den Cache auch hinzufügen. Wenn sich der Benutzer in mehr als fünf Anmeldefehlern anmeldet, ist der Benutzer gesperrt. Dem Benutzer ist es untersagt, ständig zu versuchen, sich in Anmeldeinformationen anzumelden. Sethashiterations (2); CredentialsMatcher.SetStoredCredentialshexEncoded (true); Rückgabe -Anmeldeinformationen; } /** * AuthorizationAttributesourceadvisor, die in Shiro implementierte Beraterklasse, * verwenden AopallianceAnnotationsAuthoringMethodinterceptor intern, um Methoden mit den folgenden Annotationen abzufangen. */ @Bean Public AuthorizationAttributesourceadvisor AuthorizationAttributesourceadvisor () {AuthorizationAttributesourceadvisor advisor = new AuthorizationAttributesourceadvisor (); Advisor.SetSecurityManager (SecurityManager ()); Rücksenderberater; } // @bean public shirodialect shirodialect () {return New Shirodialect (); }} 3.. Passen Sie die Realm -Verifizierungsklasse an
Paket com.yiyun.web.system.config; import com.yiyun.dao.master.userdao; Import com.yiyun.domain.userdo; import com.yiyun.web.common.utils.shiroutils; import com.yiyun.web.system.service.menuService; import org.apache.shiro.securityutils; import org.apache.shiro.authc.*; import org.apache.shiro.authz.authorizationInfo; import org.apache.shiro.authz.simpleauthorizationInfo; import org.apache.shiro.realm.authorizingrealm; import org.apache.shiro.session.session; import org.apache.shiro.subject.principalcollection; import org.springframework.beans.factory.annotation.autowired; import Java.util.*; / *** Erhalten Sie Informationen zur Benutzerrolle und Berechtigung. @Autowired Private Menuservice Menuservice; /*** Anmeldeauthentifizierung im Allgemeinen wird dem aktuellen Benutzer die Berechtigungen erteilt. Dieser Schritt basiert auf DodgetAuthenticationInfo. Erst nach Benutzerinformationen können Sie bestimmen, ob Sie den Benutzer anhand der Rolle des Benutzers und der Autorisierungsinformationen autorisieren sollen. Daher sind Rollen und Berechtigungen hier die zwei wichtige Beurteilungsbasis für den Benutzer * @Param AuthenticationToken * @return * @Throws AuthenticationException */ @Override Protected AuthenticationInfo detgetAuthenticationInfo (authenticationToken Authentifizierung) verleiht AuthenticationException {userernamepasswordteToken; Userdo user = userMapper.findByName (token.getUnername ()); // Überprüfen Sie, ob es diesen Benutzer gibt, wenn (Benutzer! Shiro führt den Passwortvergleich und die Überprüfung für US -Liste <urol> rlist = uroledao.findrolebyuid (user.getId ()); // Die Benutzerrolleliste <upermission> plist = upermissionDao.findPermissionByUID (user.GetId (); // Benutzervereinbarungsliste <String> Rolestlist = New Arraylist <Straylist <Strains> Rolestlist = New Arraylist <Straylist <Strayliste <) () // // upermission <strelllistliste = New Arraylist <) (): permissionStrist = new ArrayList <string> (); /// Benutzerkollektion für (Urol -Rolle: RLILE) {rolestrist.add (rollenname ()); } für (upermission upermission: plist) {perminStrist.add (upermission.getName ()); } user.setrolestrist (rolestrist); user.setPerminMinsStrist (PerminStrist); Sitzung Session = SecurityUtils.getSubject (). GetSession (); Session.SetAttribute ("Benutzer", Benutzer); // Wenn erfolgreich, setzen Sie es in die Sitzung //, wenn es vorhanden ist, diesen Benutzer in den Anmeldungsauthentifizierungsinformationen speichern, und Sie müssen Ihr Passwort nicht selbst vergleichen. Shiro führt eine Passwortvergleichsüberprüfung für uns durch. Neue SimplyAuthenticationInfo zurückgeben (user.getPassword (), getName ()); } return null; } / *** Berechtigungsauthentifizierung* Erhalten Sie die Berechtigungsinformationen des Benutzers, nämlich Urteile für den nächsten Schritt der Autorisierung, um die Rolle des aktuellen Benutzers und die Berechtigungsinformationen zu erhalten, die diesen Rollen gehören. zu (String) PrincipalCollection.fromRealm (getName ()). iterator (). Next (); // String loginName = (String) super.getAVailablePrincipal (PrincipalCollection); Userdo user = (userDo) lincaincollection.getPrimaryPrincipal (); // // Gehen Sie in die Datenbank, um zu überprüfen, ob dieses Objekt vorhanden ist // user user = null; // In den tatsächlichen Projekten können Sie gemäß der tatsächlichen Situation zwischenstrichen. Wenn Sie dies nicht tun, hat Shiro selbst einen Zeitintervallmechanismus und führt die Methode nicht innerhalb von 2 Minuten aus // usermapper.findByName (LoginName); if (user! // Rollensammlung des Benutzers info.addroles (user.getRolestrist ()); // Benutzerkollektion info.addStringPermissions (user.getPerMinsSstrlist ()); Info zurückgeben; } // NULL zurückgeben, wird jeder Benutzer auf die abgefangene Anfrage zugreifen, um automatisch zu der von Unauthorizedurl angegebenen Adresse zu springen. }}4. Sehen Sie sich schließlich die Konfigurationsdatei von EHCache an
<? <diskstore path = "java.io.tmpdir /tmp_ehcache" /> <!- Name: Cache-Name. MaxelementSinMemory: Maximale Anzahl von Caches MaxelementsDisk: Maximale Anzahl von Caches für Festplatten. Ewig: Ob das Objekt dauerhaft gültig ist, sobald die Zeit eingestellt ist, funktioniert die Zeitüberschreitung nicht. Überlauf: Timetoidleseconds: Legt die zulässige Leerlaufzeit (Einheit: Sekunden) des Objekts vor, bevor es abläuft. Nur verwendet, wenn das ewige = falsche Objekt nicht dauerhaft gültig ist, optional, der Standardwert ist 0, was bedeutet, dass die Leerlaufzeit unendlich ist. TimetoliveSeconds: Legt die Zeit (Einheit: Sekunden) des Objekts fest, bevor es abläuft. Die maximale Zeit liegt zwischen der Erstellungszeit und der Ausfallzeit. Nur verwendet, wenn das ewige = falsche Objekt nicht dauerhaft gültig ist, ist der Standard 0, was bedeutet, dass die Überlebenszeit des Objekts unendlich ist. Diskpersistent: Ob der Festplattenladen zwischen den Neustarts der virtuellen Maschine besteht. Der Standardwert ist falsch. DISKSPOOLBUFFERSIZEMB: Dieser Parameter legt die Cache -Größe des Datenträgers (Festplattencache) fest. Der Standard ist 30 MB. Jeder Cache sollte seinen eigenen Puffer haben. DiskexpiryThreadIntervalsEconds: Das Zeitintervall des Festplattenfehler -Thread -Laufs beträgt 120 Sekunden. MEHRSPOREVICTICTPOLICY: Wenn die MaxelementSinMemory -Grenze erreicht ist, säubert EHCACHE den Speicher gemäß der angegebenen Richtlinie. Die Standardrichtlinie ist LRU (zuletzt verwendet). Sie können es auf FIFO (zuerst in, zuerst aus) oder LFU (weniger verwendet) einstellen. ClearonFlush: Ob klären, wenn die Speichermenge maximal ist. MEHRSPOREVICTICTPOLICY: Drei Clearing -Strategien für EHCACHE; FIFO, zuerst in erster Stelle, ist dies für alle am bekanntesten, zuerst zuerst aus. LFU, weniger häufig verwendet, ist die Strategie, die im obigen Beispiel verwendet wird. Um stumpf zu sein, heißt es, dass es jemals am wenigsten gebraucht wurde. Wie oben erwähnt, hat das zwischengespeicherte Element ein Trefferattribut und der niedrigste Trefferwert wird aus dem Cache entfernt. LRU, das am wenigsten verwendet wurde, hat das zwischengespeicherte Element einen Zeitstempel. Wenn die Cache -Kapazität voll ist und Sie Platz für das Zwischenspeichern neuer Elemente schaffen müssen, wird das Element mit der am weitesten entfernten Zeit im vorhandenen Cache -Element aus dem Cache gelöscht. -> <defaultCache eternal = "false" maxelementSinMemory = "1000" Überlauf. MAXENTRIESLOCALHEAP = "2000" Eternal = "False" Timetoidleseconds = "3600" TimetoliveSeconds = "0" ÜberlaufeDisk = "False" Statistics = "True"> </cache> </ehcache>
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.