proyecto mvc formulario form español ejemplo docs desde crear configurar cero spring-mvc spring-boot shiro

spring mvc - mvc - Cómo configurar Shiro con Spring Boot



spring jsp (2)

Tengo una aplicación web Spring MVC que usa la autenticación Shiro usando la configuración de Spring en lugar de un shiro.ini.

Quiero hacer la transición a una aplicación Spring Boot.

He sido principalmente exitoso. La aplicación comienza en Spring Boot y mi entorno Shiro se configura. Sin embargo, no puedo entender cómo configurar el filtro Shiro correctamente. Necesito que esto funcione para garantizar que las solicitudes terminen siendo manejadas por el hilo correcto.

En la aplicación original configuré el Filtro Shiro en el web.xml de esta manera:

<filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

He intentado replicar esto usando una configuración Java como esta:

@Autowired private WebSecurityManager webSecurityManager; @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean() { ShiroFilterFactoryBean shiroFilterFactoryBean = new org.apache.shiro.spring.web.ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(webSecurityManager); return shiroFilterFactoryBean; } @Bean public org.apache.shiro.spring.LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { return new org.apache.shiro.spring.LifecycleBeanPostProcessor(); } @Bean public Filter shiroFilter() { DelegatingFilterProxy filter = new DelegatingFilterProxy(); filter.setTargetBeanName("shiroFilterFactoryBean"); filter.setTargetFilterLifecycle(true); return filter; }

Sin embargo, no puedo hacer que todo encaje bien y no tengo suficiente conocimiento para resolverlo. Simplemente no puedo ver para conectar el filtro al entorno. Supongo que tiene algo que ver con el orden en que se configuran las cosas.

¿Alguien ha logrado usar Spring Boot y Shiro juntos con éxito?


Lenicliu dio una gran información, ya que no puedo comentar su respuesta porque no tengo suficiente reputación. Me gustaría agregar todas las importaciones que tuve que hacer para su código para compilar realmente (tal vez sea útil para novatos en Shiro, como yo).

import java.util.HashMap; import java.util.Map; import javax.servlet.Filter; import org.apache.shiro.realm.text.PropertiesRealm; import org.apache.shiro.spring.LifecycleBeanPostProcessor; import org.apache.shiro.web.filter.authc.AnonymousFilter; import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; import org.apache.shiro.web.filter.authc.LogoutFilter; import org.apache.shiro.web.filter.authc.UserFilter; import org.apache.shiro.web.filter.authz.RolesAuthorizationFilter; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.apache.shiro.web.mgt.WebSecurityManager;


Bueno, parece que la falta de algo, configuración java como esta:

import java.util.HashMap; import java.util.Map; import javax.servlet.Filter; import org.apache.shiro.realm.text.PropertiesRealm; import org.apache.shiro.spring.LifecycleBeanPostProcessor; import org.apache.shiro.web.filter.authc.AnonymousFilter; import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; import org.apache.shiro.web.filter.authc.LogoutFilter; import org.apache.shiro.web.filter.authc.UserFilter; import org.apache.shiro.web.filter.authz.RolesAuthorizationFilter; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.apache.shiro.web.mgt.WebSecurityManager; @Bean(name = "shiroFilter") public ShiroFilterFactoryBean shiroFilter() { ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean(); shiroFilter.setLoginUrl("/login"); shiroFilter.setSuccessUrl("/index"); shiroFilter.setUnauthorizedUrl("/forbidden"); Map<String, String> filterChainDefinitionMapping = new HashMap<String, String>(); filterChainDefinitionMapping.put("/", "anon"); filterChainDefinitionMapping.put("/home", "authc,roles[guest]"); filterChainDefinitionMapping.put("/admin", "authc,roles[admin]"); shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMapping); shiroFilter.setSecurityManager(securityManager()); Map<String, Filter> filters = new HashMap<String, Filter>(); filters.put("anon", new AnonymousFilter()); filters.put("authc", new FormAuthenticationFilter()); filters.put("logout", new LogoutFilter()); filters.put("roles", new RolesAuthorizationFilter()); filters.put("user", new UserFilter()); shiroFilter.setFilters(filters); System.out.println(shiroFilter.getFilters().size()); return shiroFilter; } @Bean(name = "securityManager") public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(realm()); return securityManager; } @Bean(name = "realm") @DependsOn("lifecycleBeanPostProcessor") public PropertiesRealm realm() { PropertiesRealm propertiesRealm = new PropertiesRealm(); propertiesRealm.init(); return propertiesRealm; } @Bean public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { return new LifecycleBeanPostProcessor(); }

https://github.com/lenicliu/eg-spring/tree/master/eg-spring-boot/eg-spring-boot-shiro