Prefacio
Shiro es un marco de permiso. Para un uso específico, puede consultar su sitio web oficial http://shiro.apache.org/. Proporciona funciones de autenticación e inicio de sesión de permiso muy conveniente.
¡Como marco de código abierto, SpringBoot debe proporcionar funciones que se integren con Shiro!
Shiro ha sido utilizado en la autenticación del proyecto antes. Se usa con más frecuencia en Spring MVC, y está configurado con XML. Es relativamente simple y maduro usar shiro para controlar el permiso. Además, siempre he puesto la sesión de Shiro en MongoDB. Esto está más en línea con la intención de diseño original de MongoDB. En proyectos distribuidos, MongoDB también se usa como una capa intermedia, que se utiliza para resolver fácilmente el problema de la sincronización de la sesión en entornos distribuidos.
Desde que se lanzó Springboot, mi proyecto básicamente puede usar SpringBoot, y también es muy conveniente usar Maven para una gestión centralizada unificada. Aunque SpringBoot también proporciona un conjunto de permisos de seguridad del marco de seguridad del marco, no es muy útil, por lo que es más conveniente usar Shiro. La integración de SpringBoot con Shiro es mucho más simple que Spring MVC, al menos sin un montón de configuraciones XML, que se ve más refrescante, por lo que comenzaremos a integrarnos a continuación.
El método es el siguiente:
El primer paso debe ser agregar las dependencias de Shiro y Mongo en Maven primero. La versión shiro que uso es
<shiro.version> 1.2.3 </shiro.version>
Agregar dependencias:
<Spendency> <MoupRid> org.apache.shiro </groupid> <artifactid> shiro-core </arfactid> <version> $ {shiro.version} </verversion> </dependency> <epardency> <proupid> org.apache.shiro </groupid> <artifactid> shiro-web </artifactid> <Persion> $ {shiro.version} </versión> </pendency> <epardency> <grupid> org.apache.shiro </groupid> <artifactid> shiro-spring </artifactid> <versión> $ {shiro.version} </versión> </pendency> <epartency> <proupid> org.apache.iro </groupo </groupid> <artifactid> shiro-spring </artifactid> <versión> $ {shiro.version} </versión> </pendency> <pendency> <grupoD> org.mongodb </proupid> <artifactid> mongo-java-driver </artifactid> <version> 3.0.0.0 </lipeers> </dependency> <pendency> <MoupRid> org.springframework.data </groupid> <artifactID> spring-data-mongodb </arfactid> <versever> 1.7.0.release </ververy> </pendency>Luego configure MongoDB en Application.xml o YML
Spring.Data.MongoDB.Host = 127.0.0.1spring.data.mongoDB.port = 27017spring.data.mongodb.database = shiro_info
Una vez completada la configuración, comenzamos a escribir oficialmente el código de autenticación de Shiro, primero personalizamos un reino de autenticación, heredado de autorizar Realm
Public Class ShirodBrealm se extiende AuthorizingRealm { / *** Operación de información del usuario* / private SystemuserService SystemuserService; public shirodbrealm () {} public shirodbrealm (SystemuserService SystemuserService) {this.systemUserService = SystemUserService; } / *** Información de autorización* / @Override Autorización protegida en dogetAuthorizationInfo (Principales de Collection) {simplEutheAuthorizationInfo info = (simplEutheutorizationInfo) shirokit.getShirosessionAttr ("Perms"); if (null! = info &&! collectionUtils.isEmpty (info.getRoles ()) &&! CollectionUtils.isEmpty (info.getStringPermissions ())) {return info; } return null; } / *** Información de autenticación* / Autenticación protegida de DogetAuthenticationInfo (AuthenticationToken AuthcToken) lanza AuthenticationException {usernamePasswordToken token = (usernamePasswordToken) AuthcToken; String UserName = token.getUsername (); if (username! = null &&! "". Equals (username)) {systemuser key = new Systemuser (); key.setLogInName (token.getUsername ()); key.setPassword (String.ValueOf (token.getPassword ())); Systemuser user = SystemuserService.login (clave); if (user! = null) {Sujeto userTemp = SecurityUtils.getSubject (); userTemp.getSession (). setAttribute ("userId", user.getID ()); userTemp.getSession (). SetAttribute ("UserName", user.getUsername ()); devolver nuevo sencillouTeuthenticationInfo (user.getLoginName (), user.getPassword (), getName ()); }} return null; }}Almacene la sesión en el repositorio e implementación de MongoDB:
interfaz pública ShirosessionRepository { / ** * * @param session * / void saveSession (sesión de sesión); ......}MongoDbsessionRepository.java
clase pública MongoDbsessionRepository implementa ShirosessionRepository {MongoTemplate privado MongoTemplate; public MongoDBSessionRepository () {} public MongoDBSessionRepository (MongoTemplate MongoTemplate) {this.MongoTemplate = MongoTemplate; } @Override public void saveSession (sesión de sesión) {if (session == null || session.getId () == null) {return; } SessionBean Bean = new SessionBean (); bean.setkey (getSessionKey (session.getId ())); bean.setValue (SerializeUtil.serialize (sesión)); frijoles.setprincipal (nulo); bean.sethost (session.gethost ()); bean.setStartTimestamp (session.getStartTimestamp ()); bean.setLastAccessTime (session.getLastAccessTime ()); Bean.setTimeouttime (getTimeOuttime (session.getstarttimeStamp (), session.gettimeout ())); MongoTemplate.insert (frijol); } ......}Shirosessiondao.java
clase pública Shirosessiondao extiende AbstractSessionDao { / *** Logger* / private Static Final Logger log = loggerFactory.getLogger (shirosessiondao.class); / *** Almacenamiento de la base de datos*/ private ShirosessionRepository ShirosessionRepository; / ** * @return */ public shirosessionRepository getShirosessionRepository () {return shirosessionRepository; } / ** * * @param shirosessionRepository * / public void setShirosessionRepository (ShirosessionRepository ShirosessionRepository) {this.shirosessionRepository = shirosessionRepository; } @Override public void Update (sesión Session) lanza FOOCKSESSIONException {getShirosessionRepository (). UpdateSession (sesión); } @Override public void Delete (sesión de sesión) {if (session == null) {log.error ("La sesión no puede ser nulo, eliminar fallado"); devolver; } Serializable id = session.getId (); if (id! = null) {getShirosessionRepository (). DeleteSession (id); }} @Override Public Collection <Session> getActivesSessions () {return getShirosessionRepository (). GetAlsessions (); } @Override protegido Serializable DoCreate (sesión Session) {Serializable SessionId = this.GeneratesSessId (sesión); this.AssignSessionId (Session, SessionId); getShirosessionRepository (). Savesession (sesión); return sessionId; } @Override Session protegido doreadSession (Serializable SessionId) {return getShirosessionRepository (). GetSession (sessionId); }}¡DE ACUERDO! Se han completado todas las clases básicas y finalmente escribir una configuración para inicializar y configurar Shiro
@ConfigurationPublic Clase Shiroconfig {@Resource Private MongoTemplate MongoTemplate; @Resource SystemUserService SystemUserService; // Este es el servicio utilizado para determinar el nombre de usuario y la contraseña @Bean public shiroFilterFactFactoryBean shirofilter (defaultWebSecurityManager SecurityManager) {shirOfilterFactoryBean shirofilterFactoryBean = newFilterFactoryBean ();; shiroFilterFactoryBean.SetSecurityManager (SecurityManager); shirofilterFactoryBean.setLoginUrl ("/login"); shirofilterfactorybean.setsuccessurl ("/index"); shirofilterFactoryBean.setUnAuthorizedUrl ("/403"); // Interceptor. 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 ("/logrout", "logrout"); filterChainDefinitionMap.put ("/**", "Authc"); shirofilterFactoryBean.setFilterChainDefinitionMap (filtreChainDefinitionMap); return shirofilterfactorybean; } Public AuthorationAttributeSourCeAdVisor AuthorizationAttributesOurCeAdVisor (defaultWebSessionManager SecurityManager) {AuthorizationAttributeSourCeAdVisor adv = nueva autorizatizationTributesOurCeadVisor (); Adv.SetSecurityManager (SecurityManager); regresar adv; } @Bean Public DefaultWebSecurityManager SecurityManager (defaultWebSessionManager sessionManager, shirodbrealm myshirorealm) {defaultWebSecurityManager SecurityManager = newWebSecurityManager (); // Establecer reino. SecurityManager.SetRealm (Myshirorealm); SecurityManager.SetSessionManager (SessionManager); return SecurityManager; } /*** Reino de autenticación; (Aquí pase SystemuserService a la inicialización personalizada de ShirodBrealm) * * @return */ @bean public shirodbrealm myshirorealM () {shirodbrealm myshirorealm = new shirodbrealm (SystemuserService); regresar myshirorealm; } @Bean Public DefaultWebSessionManager SessionManager (shirosessiondao shirosessiondao) {defaultWebSessionManager sessionManager = new DefaultWebSessionManager (); SessionManager.SetGlobalSessionTimeOut (1800000L); SessionManager.SetDeleteInvalidSessions (verdadero); SessionManager.SetSessionValidationsChedulerEnabled (verdadero); SessionManager.SetSessionDao (Shirosessiondao); SessionManager.SetSessionIdCookieEnabled (verdadero); Cookie de SimpleCookie = new SimpleCookie (shirohttpsession.default_session_id_name); cookie.sethttponly (verdadero); Cookie.SetMaxage (1800000); SessionManager.SetSessionIdCookie (Cookie); Return SessionManager; } @Bean public shirosessiondao shirosessiondao (MongoDbsessionRepository ShirosessionRepository) {Shirosessiondao dao = new ShirosessionDao (); dao.setshirosessionRepository (shirosessionRepository); devolver dao; } @Bean MongoDBSessionRepository ShirosessionRepository () {MongoDBSessionRepository resp = new MongoDBSessionRepository (MongoTemplate); regresar resp; }}La tarea se realiza. Esta es solo una configuración simple. El código ha sido extraído y modificado del proyecto. En cuanto a cómo usarlo en el controlador y cómo autenticarse con diferentes permisos, es suficiente implementarlo en su propio código.
Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.