Préface
Shiro est un cadre d'autorisation. Pour une utilisation spécifique, vous pouvez consulter son site officiel http://shiro.apache.org/. Il offre des fonctions d'authentification et de connexion très pratiques.
En tant que cadre open source, Springboot doit fournir des fonctions qui s'intègrent à Shiro!
Shiro a déjà été utilisé dans l'authentification du projet. Il est utilisé plus fréquemment dans le Spring MVC, et il est configuré avec XML. Il est relativement simple et mature d'utiliser Shiro pour le contrôle de l'autorisation. De plus, j'ai toujours mis la session de Shiro à MongoDB. Ceci est plus conforme à l'intention de conception originale de MongoDB. Dans les projets distribués, MongoDB est également utilisé comme couche intermédiaire, qui est utilisée pour résoudre facilement le problème de la synchronisation des sessions dans des environnements distribués.
Depuis la sortie de Springboot, mon projet peut essentiellement utiliser Springboot, et il est également très pratique d'utiliser Maven pour une gestion centralisée unifiée. Bien que Springboot fournit également un ensemble de sécurité Spring Security Framework, il n'est relativement pas très utile, il est donc encore plus pratique d'utiliser Shiro. L'intégration de Springboot avec Shiro est beaucoup plus simple que Spring MVC, au moins sans un tas de configurations XML, qui semble plus rafraîchissante, nous allons donc commencer à intégrer ensuite.
La méthode est la suivante:
La première étape doit être d'ajouter d'abord des dépendances de Shiro et Mongo dans Maven. La version Shiro que j'utilise est
<shiro.version> 1.2.3 </hiro.version>
Ajouter des dépendances:
<dependency> <proupId> org.apache.shiro </prôdId> <Artifactid> shiro-core </retifactid> <version> $ {shiro.version} </-version> </dependency> <dependency> <proupid> org.apache.shiro </proupId> <Artifactid> Shiro-web </letifactid> <version> $ {shiro.version} </ version> </ Dependency> <Dedency> <ProupId> org.apache.shiro </rom groupe> <artifactive> shiro-spring </refactive> <version> $ {shiro.version} </ version> </pedency> <dependance> <proupId> Org.apache.shiro </pedency> <ArtefactId> Shiro-Spring </Retifactid> <Dersion> $ {shiro.version} </-version> </dependency> <dependency> <proupId> org.mongodb </proupId> <ArtifActid> Mongo-java-driver </ artifactid> <version> 3.0.0 </DERNIFRÉGENT> <groupId> org.springframework.data </proupId> <ArtefactId> Spring-data-MongoDB </letefactId> <DERSE> 1.7.0.release </ version> </Dependency>Puis configurer mongodb dans application.xml ou yml
printemps.data.mongodb.host = 127.0.0.1spring.data.mongodb.port = 27017spring.data.mongodb.database = shiro_info
Une fois la configuration terminée, nous commençons à écrire officiellement le code d'authentification Shiro, personnalisez d'abord un domaine d'authentification, hériter de l'autorisation
La classe publique ShirodBrealm étend l'autorisation d'autorisation deealm {/ ** * Fonctionnement d'informations utilisateur * / SystemUserSerService SystemUserService privé; public shirodBrealm () {} public shirodbrealm (systemUserService SystemUserService) {this.SystemUserService = SystemUserService; } / ** * Informations d'autorisation * / @Override Protected AuthorizationInfo doGetAuthorizationInfo (PrincipalCollection Principals) {SimpleAuthorizationInfo info = (SimpleAuthorizationInfo) shirokit.getShiroSessionAttr ("perms"); if (null! = info &&! CollectionUtils.Isempty (info.getRoles ()) &&! CollectionUtils.Isempty (info.getStringPerMissions ())) {return info; } return null; } / ** * Informations d'authentification * / Authentification protégéInfo doGetAuthenticationInfo (AuthenticationToken AuthCToken) lève AuthenticationException {userNamepasswordToken token = (userAmPassWordToken) AuthCToken; String username = token.getUserName (); if (username! = null &&! "". equals (nom d'utilisateur)) {systemUser key = new SystemUser (); key.setLoginName (token.getUserName ()); key.setpassword (string.valueof (token.getpassword ())); SystemUser User = SystemUserService.Login (Key); if (user! = null) {sujet userTemp = SecurityUtils.getSubject (); userTemp.getSession (). setAttribute ("userId", user.getId ()); userTemp.getSession (). setAttribute ("username", user.getUserName ()); Renvoie un nouveau SimpleAuthenticationInfo (user.getLogInName (), user.getPassword (), getName ()); }} return null; }}Session de stockage dans le référentiel et l'implémentation de MongoDB:
Interface publique ShiroSessionRepository {/ ** * * @param Session * / void SaveSession (session session); ......}MongoDBSessionRepository.java
classe publique MongoDBSessionRepository implémente ShiroSessionRepository {private mongotemplate mongotemplate; public MongoDBSessionRepository () {} public MongoDBSessionRepository (mongotemplate mongotemplate) {this.mongotemplate = mongotemplate; } @Override public void savesession (session session) {if (session == null || session.getID () == null) {return; } SessionBean Bean = new SessionBean (); bean.setkey (getSessionKey (session.getId ())); bean.setValue (serializeUtil.serialize (session)); bean.setPrincipal (null); Bean.Sethost (session.Gethost ()); bean.setStarttimeStamp (session.getStartTimeStamp ()); bean.setLastAccessTime (session.getLastAccessTime ()); bean.setTimeoutTime (getTimeoutTime (session.getStartTimestamp (), session.getTimeout ())); mongotemplate.insert (haricot); } ......}ShiroSessiondao.java
classe publique ShiroSessionDao étend AbstractSessionDao {/ ** * Logger * / private static final logger log = loggerfactory.getLogger (shiroSessiondao.class); / ** * Stockage de la base de données * / private shiroSessionRepository shiroSessionRepository; / ** * @return * / public shiroSessionRepository getShiroSessionRepository () {return shiroSessionRepository; } / ** * * @param shiroSessionRepository * / public void SetShiroSessionRepository (shiroSessionRepository shiroSessionRepository) {this.shiroSessionRepository = shiroSessionRepository; } @Override public void Update (Session Session) lève UnknownSessionException {getShiroSessionRepository (). UpdaSeSession (session); } @Override public void Delete (Session Session) {if (session == null) {log.error ("Session ne peut pas être nul, supprimer l'échec"); retour; } Serializable id = session.getId (); if (id! = null) {getShiroSessionRepository (). DeleteSession (id); }} @Override public Collection <Session> getActivesessions () {return getShiroSessionRepository (). GetAlSessions (); } @Override Protected Serializable DOCreate (Session Session) {Serializable SessionID = this.GenerateSessionId (session); this.AssignSessionId (session, sessionID); getShiroSessionRepository (). Savessession (session); return sessionId; } @Override Protected Session DoreadSession (Serializable SessionID) {return getShiroSessionRepository (). GetSession (sessionId); }}D'ACCORD! Toutes les classes de base ont été terminées et enfin écrivez une configuration pour initialiser et configurer Shiro
@Configurationpublic class shiroConfig {@Resource private mongotemplate mongotemplate; @Resource Private SystemUserService SystemUserService; // Ceci est le service utilisé pour déterminer le nom d'utilisateur et le mot de passe @Bean public shirofilterfactorybean shirofilter (DefaultWebSecurityManager SecurityManager) {ShirofterFactoryBean ShirofilterFactoryBean = New ShirofilterFactoryBean (); ShirofilterFactoryBean.SetSecurityManager (SecurityManager); shirofilterFactoryBean.setLoginurl ("/ login"); shirofilterFactoryBean.SetSucCessurl ("/ index"); shirofilterfactorybean.setUnAuthorizeDUrl ("/ 403"); // intercepteur. Map <string, string> filterChainDefinitionMap = new LinkedHashMap <String, String> (); filterChainDefinitionMap.put ("/ static / **", "anon"); filterchainDefinitionMap.put ("/ ajaxlogin", "anon"); filterchainDefinitionMap.put ("/ libs / **", "anon"); filterChainDefinitionMap.put ("/ images / **", "anon"); filterChainDefinitionMap.put ("/ Logout", "Logout"); FilterChainDefinitionMap.put ("/ **", "Authc"); ShirofilterFactoryBean.SetFilterChainDefinitionMap (FilterChainDefinitionMap); retour shirofilterfactoryBean; } Autorisation publiqueAttributesourceadVisor AuthorizationAtRributesourceadVisor (DefaultWebSessionManager SecurityManager) {AutorisationAtRiButesourCeadVisor adv = new AuthorizationAtRiButesourCeadVisor (); Adv.SetSecurityManager (SecurityManager); retour adv; } @Bean public DefaultWebSecurityManager SecurityManager (DefaultWebSessionManager SessionManager, ShirodBrealm Myshirorealm) {DefaultWebSecurityManager SecurityManager = new DefaultWebSecurityManager (); // Définit le royaume. SecurityManager.SetRealm (Myshirorealm); SecurityManager.SetSessionManager (SessionManager); Retour SecurityManager; } / ** * Realm d'authentification; (Passez ici SystemUserService à l'initialisation de ShirodBrealm personnalisée) * * @return * / @bean public shirodbrealm myshirorealm () {shiroDBrealm myshirorealm = new shirodbrealm (SystemeSerService); retourner myshirorealm; } @Bean public DefaultWebSessionManager SessionManager (ShiroSessiondao shiroSessiondao) {defaultWebSessionManager SessionManager = new defaultWebSessionManager (); SessionManager.SetGlobalSSESTimeout (1800000L); SessionManager.SetDeleteInvalidSessions (true); SessionManager.SetSessionValidationsCheDuleReenabled (true); SessionManager.Setsessiondao (ShiroSessiondao); SessionManager.SetSessionIdCOokieEenabled (true); SimpleCookie Cookie = new SimpleCookie (shirohttpSession.default_session_id_name); cookie.sethttponly (vrai); Cookie.SetMaxage (1800000); SessionManager.SetSessionIdcookie (cookie); Retour sessionManager; } @Bean public shiroSessiondao shiroSessiondao (MongoDbSessionRepository shiroSessionRepository) {shiroSessiondao dao = new shiroSessiondao (); dao.setShiroSessionRepository (shiroSessionRepository); retour dao; } @Bean MongoDBSessionRepository ShiroSessionRepository () {MongoDBSessionRepository resp = new MongoDBSessionRepository (Mongotemplate); retour resp; }}La tâche est effectuée. Ce n'est qu'une configuration simple. Le code a été extrait et modifié à partir du projet. En ce qui concerne comment l'utiliser dans le contrôleur et comment s'authentifier avec différentes autorisations, il suffit de l'implémenter dans votre propre code.
Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.