【问题标题】:org.apache.shiro.web.filter.authc.LogoutFilter is already configured in ShiroWebModuleShiroWebModule 中已经配置了 org.apache.shiro.web.filter.authc.LogoutFilter
【发布时间】:2021-06-21 22:52:15
【问题描述】:

我使用的是 Shiro 1.7.1 和 Guice 4.2.3,下面是我的 POM 文件的 sn-p,

  <properties>
    <shiro.version>1.7.1</shiro.version>
    <guice.version>4.2.3</guice.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-web</artifactId>
      <version>${shiro.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-guice</artifactId>
      <version>${shiro.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-ehcache</artifactId>
      <version>${shiro.version}</version>
    </dependency>
    <dependency>
      <groupId>com.google.inject</groupId>
      <artifactId>guice</artifactId>
      <version>${guice.version}</version>
    </dependency>
    <dependency>
      <groupId>com.google.inject.extensions</groupId>
      <artifactId>guice-servlet</artifactId>
      <version>${guice.version}</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    ...
  </dependencies>

我正在通过创建一个新类来自定义 Shiro 的 LogoutFilter,

package com.myshiro.myshiro;


import org.apache.shiro.web.filter.authc.LogoutFilter;

public class MyLogoutFilter extends LogoutFilter {
}

并将org.apache.shiro.web.filter.authc.LogoutFilter绑定到上面自定义的MyLogoutFilter

package com.myshiro.myshiro;

public class MyShiroModule extends ShiroWebModule {

    public MyShiroModule(ServletContext servletContext) {
        super(servletContext);
    }

    protected void configureShiroWeb() {
        try {
            bindRealm().toConstructor(IniRealm.class.getConstructor(Ini.class));
        } catch (NoSuchMethodException e) {
            addError(e);
        }
        bind(org.apache.shiro.web.filter.authc.LogoutFilter.class).to(MyLogoutFilter.class).in(Scopes.SINGLETON);
        addFilterChain("/logout", LOGOUT);
    }
}

我尝试像这样在单元测试类中创建 Guice 注入器,

public class MyShiroModuleTest {

    @Mock
    private ServletContext servletContext;

    @Test
    public void test() {
        Guice.createInjector(new MyShiroModule(servletContext));
    }
}

它失败并出现以下错误,

1) Binding to null instances is not allowed. Use toProvider(Providers.of(null)) if this is your intended behaviour.
  at org.apache.shiro.guice.web.ShiroWebModule.configureShiro(ShiroWebModule.java:136)

2) A binding to org.apache.shiro.web.filter.authc.LogoutFilter was already configured at com.myshiro.myshiro.MyShiroModule.configureShiroWeb(MyShiroModule.java:25).
  at org.apache.shiro.guice.web.ShiroWebModule.setupFilterChainConfigs(ShiroWebModule.java:209)

从上面的第二个注释中,它解释了与 org.apache.shiro.web.filter.authc.LogoutFilter 的绑定已经在 MyShiroModule 和 ShiroWebModule 中配置。您知道如何绑定到我自定义的 LogoutFilter 吗?

这个问题在 Shiro 1.3.x 中没有发生。

我的示例项目可用here,您只需mvn clean install就可以看到错误。

【问题讨论】:

  • 您使用的Guice版本是否也发生了变化?
  • 是的,依赖是 Shiro 1.7.1 和 Guice 4.2.3。
  • 欢迎查看我的示例代码here

标签: shiro


【解决方案1】:

听起来您的问题与 Guice 4 有关,而与 Shiro 无关。不要重复使用相同的绑定键,而是定义一个新的,例如:

bind(MyLogoutFilter.class).to(MyLogoutFilter.class).in(Scopes.SINGLETON);
addFilterChain("/logout", Key.get(MyLogoutFilter.class));

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    相关资源
    最近更新 更多