java - spring-boot-shiro 客户过滤器不起作用

标签 java spring spring-boot shiro

全部

spring-boot运行错误: 可用过滤器池中没有名称为“userAuthorizationFilter”的过滤器可应用于链[/**]。确保首先使用 addFilter 方法注册具有该名称/路径的过滤器。

  <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring-boot-web-starter</artifactId>
        <version>1.4.0</version>
  </dependency>

shiroConfig.java:

@Configuration
public class ShiroConfig{

@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
    DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();

    chainDefinition.addPathDefinition("/css/**", DefaultFilter.anon.name());
    chainDefinition.addPathDefinition("/js/**", DefaultFilter.anon.name());
    chainDefinition.addPathDefinition("/images/**", DefaultFilter.anon.name());
    chainDefinition.addPathDefinition("/favicon.ico", DefaultFilter.anon.name());


    chainDefinition.addPathDefinition("/logout", DefaultFilter.logout.name());
    chainDefinition.addPathDefinition("/login", DefaultFilter.anon.name());

    chainDefinition.addPathDefinition("/**", "userAuthorizationFilter");
    return chainDefinition;
}

@Bean(name = "userAuthorizationFilter")
public UserAuthorizationFilter userAuthorizationFilter(){
    return new UserAuthorizationFilter();
}


@Bean
public UserRealm userRealm() {
    UserRealm userRealm = new UserRealm();
    return userRealm;
}

@Bean
public DefaultWebSecurityManager securityManager() {
    DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
    manager.setRealm(userRealm());
    return manager;
}

}

[mvn spring-boot:run]错误日志:

Caused by: java.lang.IllegalArgumentException: There is no filter with name 'userAuthorizationFilter' to apply to chain [/**] in the pool of available Filters.  Ensure a filter with that name/path has first been registered with the addFilter method(s).
at org.apache.shiro.web.filter.mgt.DefaultFilterChainManager.addToChain(DefaultFilterChainManager.java:265)
at org.apache.shiro.web.filter.mgt.DefaultFilterChainManager.createChain(DefaultFilterChainManager.java:148)
at org.apache.shiro.spring.web.ShiroFilterFactoryBean.createFilterChainManager(ShiroFilterFactoryBean.java:397)
at org.apache.shiro.spring.web.ShiroFilterFactoryBean.createInstance(ShiroFilterFactoryBean.java:437)
at org.apache.shiro.spring.web.ShiroFilterFactoryBean.getObject(ShiroFilterFactoryBean.java:343)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168)
... 43 common frames omitted

我是否缺少配置的重要部分?

如有任何帮助,我们将不胜感激。 谢谢。

最佳答案

您似乎没有为自己的过滤器“userAuthorizationFilter”分配别名;

您应该在 ShiroFilterFactoryBean 初始化中定义别名。

@Bean(name = "shiroFilter")
public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager, UserAuthorizationFilter  authorizationFilter) {

    ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
    shiroFilterFactoryBean.setSecurityManager(securityManager);
    //...........................some other codes
    HashMap<String, Filter> map = new HashMap<>();
    map.put("userAuthorizationFilter",authorizationFilter);
    shiroFilterFactoryBean.setFilters(map);

    //...........................some other codes
    return shiroFilterFactoryBean;
}

关于java - spring-boot-shiro 客户过滤器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47974718/

相关文章:

java - 在 Java 中执行周期性边界条件的最快方法

java - Java 版电梯模拟器帮助

java - 如何在多个 Spring boot 应用程序之间共享 H2 内存数据库?

java - Spring Boot 不为 ZonedDateTime 使用自定义反序列化器

java - 如何在请求中通过 id 引用实体

java - Spring Boot 2 中缺少 TomcatEmbeddedServletContainerFactory

java - Spring Retry 中的增量线性退避

java - 如何在Java中而不是在斑马打印机上使用ZPL命令打印斑马图像

java - 从主类或启动监听器运行临时 Spring Boot 应用程序?

java - 如何在 spring mvc 中的服务器端验证上显示错误消息