记一次Spring MVC5 集成Shiro

浏览:963 发布日期:2023-08-26 11:53:52

好久不用Spring MVC了,折腾了好久,总算是完成了,记录一下。

Spring版本是5.3.29Shiro 1.12.0

pom.xml

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.12.0</version>
</dependency>

程序初始化器:

@Override
protected Class<?>[] getRootConfigClasses()
{
    return new Class<?>[] {AppConfig.class};
}

@Override
protected Class<?>[] getServletConfigClasses()
{
    return new Class<?>[] { WebConfig.class };
}

@Override
public void onStartup(ServletContext servletContext) throws ServletException
{
        FilterRegistration.Dynamic shiroFilter = servletContext.addFilter("shiroFilterFactoryBean",
                DelegatingFilterProxy.class);
        shiroFilter.setInitParameter("targetFilterLifecycle", "true");
        shiroFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false,
                "/*");

        super.onStartup(servletContext);
 }

ShiroConfig:

@Configuration
@PropertySource("classpath:shiro.properties")
@ComponentScan(basePackages = { "com.store.security" })
@Import({
        ShiroBeanConfiguration.class,
        ShiroWebConfiguration.class,
        ShiroWebFilterConfiguration.class
})
public class ShiroConfig
{
    // 定义主要的Filter
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager sm)
    {
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        bean.setSecurityManager(sm);
        bean.setLoginUrl("/admin/login");
        bean.setUnauthorizedUrl("/login");
        bean.setSuccessUrl("/");

        Map<String, String> map = new HashMap<>();
        map.put("/", "anon");
        map.put("/admin/login", "anon");
        map.put("/admin", "authc");
        map.put("/admin/*", "authc");

        bean.setFilterChainDefinitionMap(map);

        return bean;
    }
    ...
}

Shiro之前版本有遍历路径漏洞,所以Shiro提供了一个ShiroRequestMappingConfig配置类,我们在这里暂不引入,在WebConfig中再引入,因为它依赖一个RequestMappingHandlerMappingbean,只有启用@EnableWebMvc注解才会注入,所以我们把这个配置放到那里引入。