七、Shiro过滤器

本文详细介绍Shiro框架的内置过滤器及自定义过滤器实现,包括角色和权限的控制方法,如roles、perms过滤器的使用,以及如何自定义过滤器满足特定需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、内置过滤器

(一)内置过滤器介绍

  • roles[a,b,c],必须角色都符合才可以访问
  • perms[a,b],必须全部拥有该权限才可以访问
  • port[a,b],必须指定端口才可以访问!!
  • ####################################
  • anno:无权限访问
  • authc:需要认证才能访问
  • user:代表需要存在该用户对象才可访问
  • logout 登录退出才能被访问

(二)内置过滤器测试

<!--Shiro过滤器-->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!--设置Shiro的securityManager-->
        <property name="securityManager" ref="securityManager"/>
        <!--登录网址-->
        <property name="loginUrl" value="login.html"/>
        <!--未授权网址-->
        <property name="unauthorizedUrl" value="403.html"/>
        <!--过滤器链 anon匿名访问的路径  authc必须验证通过才能访问的路径 配置在前面的优先生效!-->
        <property name="filterChainDefinitions">
            <value>
                /login.html = anon
                /sublogin = anon
                <!--只有拥有该角色,才能访问。。。-->
                /testRole = roles[admin]
                /testRole1 = roles[admin,user]
                <!--只有拥有该权限,才能访问。。。-->
                /testPermission = perms[user:delete]
                /testPermission1 = perms[user:delete,user:add]

                /* = authc
            </value>
        </property>
    </bean>

二、自定义过滤器
  内置过滤器的缺点:比如/testRole1 = roles[admin,user]表示必须同时拥有admin,user角色才可访问/testRole1,但有时我们需要只要拥有其中一个角色即可访问,这种需求内置过滤器无法满足,所以我们需要自定义过滤器。

  若是自定义认证相关的过滤器,则需要继承AuthenticationFilter;若是自定义授权相关的过滤器,则需要继承AuthorizationFilter

  这里以实现只要拥有其中一个角色即可访问为例进行自定义过滤器讲解。

(一)创建自定义过滤器RolesOrFilter

/**
 * @author 咸鱼
 * @date 2018/9/8 22:18
 * RolesOrFilter作用:只要访问用户有要求的其中一个角色,即可进行访问
 */
public class RolesOrFilter extends AuthorizationFilter {
    @Override
    protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
        //调用父类方法获取Subject对象
        Subject subject = getSubject(servletRequest, servletResponse);
        /**
         *     自定义的过滤器会在"shiroFilter"中被配置成一个标签,比如这里的过滤器会被配置成:
         * <entry key="rolesOr" value-ref="rolesOrFilter"/>
         * 有了这个标签以后,我们会用该标签控制访问路径,比如“/testRole1 = rolesOr[admin,user]”,
         * 而这里的Object参数就是admin,user角色数组。
         */
        String[] roles = (String[]) o;

        if (roles != null && roles.length != 0){
            for (String role : roles){
                //判断访问主体是否有该角色
                if (subject.hasRole(role)){
                    return true;
                }
            }
        }
        return false;
    }
}

(二)配置自定义过滤器

<!--Shiro过滤器-->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!--设置Shiro的securityManager-->
        <property name="securityManager" ref="securityManager"/>
        <!--登录网址-->
        <property name="loginUrl" value="login.html"/>
        <!--未授权网址-->
        <property name="unauthorizedUrl" value="403.html"/>
        <!--过滤器链 anon匿名访问的路径  authc必须验证通过才能访问的路径 配置在前面的优先生效!-->
        <property name="filterChainDefinitions">
            <value>
                /login.html = anon
                /sublogin = anon
                /testRole = roles[admin,user]

                /testRole1 = rolesOr[admin,user]

                /testPermission = perms[user:delete]
                /testPermission1 = perms[user:delete,user:add]
                /* = authc
            </value>
        </property>
        <!--将自定义过滤器配置成标签-->
        <property name="filters">
            <util:map>
                <entry key="rolesOr" value-ref="rolesOrFilter"/>
            </util:map>
        </property>
    </bean>
    <!--自定义过滤器-->
    <bean id="rolesOrFilter" class="org.pc.filter.RolesOrFilter"/>
### Apache Shiro 过滤器链的配置与作用 #### 一、过滤器链的概念 Shiro 的核心功能之一是通过过滤器链实现对 Web 请求的安全控制。过滤器链本质上是由一系列按顺序排列的过滤器组成,每个过滤器负责处理特定类型的请求或执行某种安全逻辑。这种机制使得开发者能够灵活地定义哪些 URL 路径应该由哪些过滤器处理,并指定它们的执行顺序。 #### 二、过滤器链的核心组件 1. **ShiroFilterFactoryBean**: Shiro 使用 `ShiroFilterFactoryBean` 来管理和初始化过滤器链。它是一个 Spring Bean,在 Spring 应用中用于配置 Shiro 的 Web 过滤器链[^2]。该类允许开发者以 Map 形式定义过滤器链,其中键表示 URL 模式,值则对应于过滤器名称或过滤器链定义。 2. **filterChainDefinitions 参数**: 在 Shiro 中,可以通过 `filterChainDefinitions` 参数来定义过滤器链的行为。这个参数通常是以字符串形式提供的,类似于 INI 文件中的配置语法。例如: ```ini /favicon.ico=anon /webjars/**=anon /web/**=anon /login=anon /**=authc ``` 上述配置表明 `/favicon.ico`, `/webjars/**`, 和 `/web/**` 不需要身份验证即可访问 (`anon`);而其他所有路径都需要经过身份验证 (`authc`)[^4]。 #### 三、常见过滤器及其作用 以下是 Shiro 提供的一些常用内置过滤器: | 过滤器名 | 功能描述 | |----------|------------------------------------------------------------------------| | anon | 表示匿名访问,即无需登录即可访问资源。 | | authc | 表示需要用户身份认证才能访问资源。如果未认证,则会重定向到登录页面。 | | user | 如果用户已经记住过 (RememberMe),或者已成功登录,则可以访问受保护的资源。 | | perms | 需要具备某个权限才可以访问资源。如果不满足条件,则抛出异常或跳转至无权访问页。 | | roles | 用户需具有某角色才可访问资源。不满足时同样会抛出异常或跳转至无权访问页。 | #### 四、代码示例:如何配置过滤器链 以下是一个典型的基于 Java Config 的 Shiro 过滤器链配置示例: ```java @Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean(); shiroFilter.setSecurityManager(securityManager); // 定义过滤器链映射关系 Map<String, String> filterMap = new LinkedHashMap<>(); // 放行静态资源和登录接口 filterMap.put("/favicon.ico", "anon"); filterMap.put("/webjars/**", "anon"); filterMap.put("/web/**", "anon"); filterMap.put("/login", "anon"); // 所有其他请求均需 OAuth2 认证 filterMap.put("/**", "oauth2"); shiroFilter.setFilterChainDefinitionMap(filterMap); return shiroFilter; } ``` 上述代码片段展示了如何通过 `ShiroFilterFactoryBean` 设置过滤器链。这里放行了一些公共资源(如图标文件、前端库),并规定除登录外的所有请求都必须通过 OAuth2 认证[^3]。 #### 五、总结 Apache Shiro过滤器链设计提供了强大的灵活性,使开发人员可以根据业务需求精确控制不同 URL 的访问策略。借助 `ShiroFilterFactoryBean` 及其内部维护的 `filterChainDefinitions` 属性,可以轻松完成复杂的过滤器链配置工作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值