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

添加自定义筛选器Apache Shiro+Spring Boot

平学
2023-03-14

我正在尝试将基于Spring MVC xml的项目配置重构为基于Spring Boot java的配置。同时按如下方式设置shiro配置:

@Configuration
public class ShiroConfig {

    @Bean
    public Realm realm() {
        JdbcRealm myRealm = new JdbcRealm();
        myRealm.setCredentialsMatcher(sha256Matcher());
        myRealm.setPermissionsLookupEnabled(true);
        myRealm.setSaltStyle(JdbcRealm.SaltStyle.COLUMN);
        return myRealm;
    }

    @Bean
    public HashedCredentialsMatcher sha256Matcher() {
        HashedCredentialsMatcher sha256Matcher = new HashedCredentialsMatcher();
        sha256Matcher.setHashAlgorithmName("SHA-256");
        return sha256Matcher;
    }

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

    @Bean
    public CacheManager cacheManager() {
        return new MemoryConstrainedCacheManager();
    }       

    @Bean
    public Filter jwtv() {
        return new JWTVerifyingFilter();
    }

    @Bean
    public Filter ljwtv() {
        return new LimitedAccessJWTVerifyingFilter();
    }

    @Bean
    public Filter logout() {
        LogoutFilter logoutFilter = new LogoutFilter();
        logoutFilter.setRedirectUrl("/login.jsp");
        return logoutFilter;
    }

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

        chainDefinition.addPathDefinition("/login", "authc");
        chainDefinition.addPathDefinition("/logout", "logout");
        chainDefinition.addPathDefinition("/my/test/**", "anon");
        chainDefinition.addPathDefinition("/my/xyz/**/abc", "ljwtv");            chainDefinition.addPathDefinition("/my/xyz/**/mno", "ljwtv");
        chainDefinition.addPathDefinition("/my/**", "jwtv");

        return chainDefinition;
    }

}

共有1个答案

朱鹏
2023-03-14

看来引导集成没有从Spring上下文中添加过滤器。(在启动前/Java配置,这通常是用XML定义的,不是问题)。

解决方法非常简单,只需添加这个bean def:

@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Value("#{ @environment['shiro.loginUrl'] ?: '/login.jsp' }") String loginUrl,
                                                     @Value("#{ @environment['shiro.successUrl'] ?: '/' }") String successUrl,
                                                     @Value("#{ @environment['shiro.unauthorizedUrl'] ?: null }") String unauthorizedUrl,
                                                     SecurityManager securityManager,
                                                     ShiroFilterChainDefinition shiroFilterChainDefinition,
                                                     Map<String, Filter> filterMap) {

    ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();

    filterFactoryBean.setLoginUrl(loginUrl);
    filterFactoryBean.setSuccessUrl(successUrl);
    filterFactoryBean.setUnauthorizedUrl(unauthorizedUrl);

    filterFactoryBean.setSecurityManager(securityManager);
    filterFactoryBean.setFilterChainDefinitionMap(shiroFilterChainDefinition.getFilterChainMap());
    filterFactoryBean.setFilters(filterMap);

    return filterFactoryBean;
}

我还创建了一个PR来将它添加回Shiro中(一旦我们添加了测试)。

@Bean
public FilterRegistrationBean logout() {
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
    LogoutFilter logoutFilter = new LogoutFilter();
    logoutFilter.setRedirectUrl("/login.jsp");
    filterRegistrationBean.setFilter(logoutFilter);
    filterRegistrationBean.addUrlPatterns("/logout.htm");
    return filterRegistrationBean;
}

如果定义了过滤器bean,并使用filterregistrationbean禁用它,Spring不会自动添加过滤器(IIRC)。这意味着Shiro可以管理过滤器链(这是我们希望发生的事情)

使用以下代码段:```@bean public Filter jwtv(){return new JWTVerifyingFilter();}

@Bean
public FilterRegistrationBean jwtvFilterRegBean() {
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
    filterRegistrationBean.setFilter(jwtv());
    filterRegistrationBean.setEnabled(false);
    return filterRegistrationBean;
}

```

但点击/test时不是。

对于试图实现自定义筛选器(如JWT标记化授权:示例项目)的任何人

 类似资料:
  • 我有一个扩展类的类,它看起来像: 问题是,我可以向添加自定义吗?我浏览了和中可用的所有方法,但没有找到任何方法。但是在模式下,我发现在中有的列表。如何在此添加自定义?

  • 存储在Django模型中的元素如下 示例数据如下: . 结果:找到对象- 结果:找到对象- 结果:找到对象- 结果:未找到对象 如何使用过滤器和正则表达式进行这些查询?

  • 我创建了一个自定义筛选器,用于获取令牌,然后用与令牌相关的角色填充身份验证对象 然后,我将该过滤器添加到springsecuritycontext中,如下所示: 应用程序已经存在,我只是尝试添加Spring Security层。Spring Security版本为4.2.3。在尝试实现此功能的几天后,不会加载,因此不会筛选任何请求。请帮帮忙。

  • 下面是过滤器的外观。 对于WebSecurityConfigurerAdapter#configure(webSecurityWeb)web.忽略()中包含的路径,我希望该筛选器不会像Spring Security筛选器链的其余部分一样激发。 下面是它的样子 我希望在调用Spring Security链的其余部分时调用这个过滤器,并对web.igneration()中的路径忽略这个过滤器,就像Sp

  • 我想添加用户的ID作为自定义声明到我的令牌。 但我无法在过滤器中获取用户id,因为依赖注入在过滤器中不起作用。我尝试使用UserService的构造函数,但在这个服务中,我有一个存储库,它是im@Autowiring,所以在调试模式下,我看到userRepository字段为空。 我的问题是我将如何添加这个自定义声明?也许这是添加这个的另一种方式。 我正在学习本教程(没有“旁白”章节)https: