当前位置: 首页 > 知识库问答 >
问题:

org.apache.shiro.web.filter.authc。已在ShiroWebModule中配置了注销筛选器

韩峰
2023-03-14

我正在使用Shiro 1.7.1和Guice 4.2.3,下面是我的POM文件的片段,

  <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 {
}

并绑定<code>org.apache.shiro.web.filter.authc。LogoutFilter到上述自定义的mylogoutfilt

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中没有发生此问题。

我的示例项目可以在这里找到,当您< code>mvn clean install时,您可以简单地看到错误。

共有1个答案

有骏奇
2023-03-14

听起来你的问题与Guice 4有关,而不是与Shiro有关。不要重用相同的绑定键,而是定义一个新绑定键,如下所示:

bind(MyLogoutFilter.class).to(MyLogoutFilter.class).in(Scopes.SINGLETON);
addFilterChain("/logout", Key.get(MyLogoutFilter.class));
 类似资料:
  • 我试图从管理各种Tomcat实例的应用程序生命周期的第三方工具的正常应用程序日志中筛选出启动(/关闭)事件。基础是(2.12.1),中使用,用于简单的追加器(下面的示例进行了大量简化,包括硬编码值): 相应的记录器如下所示: 当我启动实例时,将创建两个日志文件。但是,只有应用程序日志文件(application appender)包含条目,其中包括我感兴趣的要过滤掉的条目: 有什么想法,如何调试,

  • 我正在使用Spring Security 3.2和Spring 4.0.1 下面是我正在尝试的Java配置 这是自定义筛选器类。给我带来麻烦的是AuthenticationManager的setter

  • 我正在尝试将spring-security-oauth添加到一个带有spring-security的现有应用程序中。我正在使用Java配置。 我有一个已修改的筛选器链(添加了一些自定义筛选器),但是对'/oauth/token'的请求没有使用它,而是使用了'default'筛选器链。如何访问保护oauthendpoint的筛选器链,以便也可以在那里使用自定义筛选器,或者将oauthendpoint

  • 问题内容: 只是想知道注销后可以在哪里设置重定向到的URL。我知道您可以设置登录网址。我想重定向到我的主页。 问题答案: 一种更简单的方法: 在你的登出请求网址中添加“下一个”参数。例如: 然后,注销视图将为你解决问题。 对于登录后重定向,你只需在settings.py中进行设置即可:

  • 我想以正确的顺序列出我的所有过滤器,因为我有一些过滤器必须在FilterChain的第一个。 我可以从ServletContext中获取所有过滤器,如下所示: