【问题标题】:Shiro using spring gives " Shiro INI configuration was either not found or discovered to be empty/unconfigured."Shiro 使用 spring 给出“Shiro INI 配置未找到或发现为空/未配置。”
【发布时间】:2017-09-04 11:28:13
【问题描述】:

我能够让 shiro 与 shiro.ini 和 spring 一起运行,但我想使用 shiro 注释,所以我试图在没有 ini 文件的情况下使用 shiro-spring。但这让我很难过, 错误:

org.apache.shiro.config.ConfigurationException:未找到 Shiro INI 配置或发现为空/未配置。 在 org.apache.shiro.web.env.IniWebEnvironment.init(IniWebEnvironment.java:87) 在 org.apache.shiro.util.LifecycleUtils.init(LifecycleUtils.java:45) 在 org.apache.shiro.util.LifecycleUtils.init(LifecycleUtils.java:40) 在 org.apache.shiro.web.env.EnvironmentLoader.createEnvironment(EnvironmentLoader.java:226) 在 org.apache.shiro.web.env.EnvironmentLoader.initEnvironment(EnvironmentLoader.java:138) 在 org.apache.shiro.web.env.EnvironmentLoaderListener.contextInitialized(EnvironmentLoaderListener.java:58) 在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4742) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5206) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1439) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1429) 在 java.util.concurrent.FutureTask.run(未知来源) 在 org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) 在 java.util.concurrent.AbstractExecutorService.submit(未知来源) 在 org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:953) 在 org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:872) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1439) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1429) 在 java.util.concurrent.FutureTask.run(未知来源) 在 org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) 在 java.util.concurrent.AbstractExecutorService.submit(未知来源) 在 org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:953) 在 org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) 在 org.apache.catalina.core.StandardService.startInternal(StandardService.java:422) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) 在 org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:793) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) 在 org.apache.catalina.startup.Catalina.start(Catalina.java:655) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:355) 在 org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495)

2017 年 4 月 9 日下午 4:15:32 org.apache.catalina.core.StandardContext startInternal

代码:Spring 配置:

package com.studentshare.config;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.Filter;

import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.realm.jdbc.JdbcRealm;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.studentshare")
public class AppConfig {

    @Bean
    public JdbcRealm myRealm() {
        JdbcRealm jdbcRealm = new JdbcRealm();
        jdbcRealm.setAuthenticationQuery("select password from unishare.users where user_name = ?");
        MysqlDataSource dataSource = new MysqlDataSource();
        dataSource.setServerName("localhost");
        dataSource.setUser("root");
        dataSource.setPassword("root");
        dataSource.setDatabaseName("unishare");

        jdbcRealm.setDataSource(dataSource);
        jdbcRealm.setCredentialsMatcher(new HashedCredentialsMatcher());
        return jdbcRealm;
    }

    @Bean
    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();
    }

    @Bean
    public DefaultWebSecurityManager securityManager(@Autowired JdbcRealm myRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(myRealm);
        return securityManager;
    }

    @Bean
    public BasicHttpAuthenticationFilter myAuthBasic(){
        return new BasicHttpAuthenticationFilter();
    }
    @Bean
    public ShiroFilterFactoryBean ShiroFilter(@Autowired DefaultWebSecurityManager securityManager,@Autowired BasicHttpAuthenticationFilter myAuthBasic) {
        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
        shiroFilter.setSecurityManager(securityManager);

        Map<String, Filter> filters = new HashMap<>();
        filters.put("myAuthcBasic", myAuthBasic);
        shiroFilter.setFilters(filters);

        /*Map<String, String> filterChainDefinitionMap = new HashMap<>();
        filterChainDefinitionMap.put("/", "authcBasic");*/
        shiroFilter.setFilterChainDefinitions("/ = myAuthcBasic");//p(filterChainDefinitionMap);
        return shiroFilter;
    }

    @DependsOn("lifecycleBeanPostProcessor")
    @Bean
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
        return new DefaultAdvisorAutoProxyCreator();
    }



}

网页配置:

package com.studentshare.config;

import java.util.EnumSet;

import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;

import org.apache.shiro.web.env.EnvironmentLoaderListener;
import org.apache.shiro.web.servlet.ShiroFilter;
import org.springframework.web.filter.DelegatingFilterProxy;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

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

    @Override
    protected Class[] getServletConfigClasses() {
        return null;
    }

    @Override
    protected Filter[] getServletFilters() {
        return new Filter[] { new ShiroFilter() };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);
        servletContext.addListener(EnvironmentLoaderListener.class);
        EnumSet<DispatcherType> shiroDispatchers = EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD,
                DispatcherType.INCLUDE, DispatcherType.ERROR);

        FilterRegistration shiroFilter = servletContext.addFilter("ShiroFilter", DelegatingFilterProxy.class);
        shiroFilter.setInitParameter("targetFilterLifecycle", "true");
        shiroFilter.addMappingForUrlPatterns(shiroDispatchers, false,
                "/*");
    }

}

【问题讨论】:

    标签: java spring spring-mvc shiro


    【解决方案1】:

    看看 1.4+ 版本,Spring 集成已经更新(针对 Spring 和 Spring Boot)。

    但是对于您的具体问题,您似乎正在尝试使用 EnvironmentLoaderListener。使用 Spring 时,您需要让 Spring 处理加载组件的生命周期。

    示例见:https://github.com/apache/shiro/blob/1.3.x/samples/spring-hibernate/src/main/webapp/WEB-INF/web.xml

    【讨论】:

    • EnvironmentLoaderListener 的使用是造成我这个问题的原因。
    猜你喜欢
    • 2017-02-21
    • 2011-11-18
    • 2018-09-03
    • 2014-10-04
    • 2011-10-15
    • 2019-01-06
    • 2014-01-04
    • 2015-04-01
    • 2018-07-31
    相关资源
    最近更新 更多