• 008 shiro的过滤器


    一 .概述

      在上一节之中,我们说到shiro使用过滤器完成整个web的权限管理.

      现在我们来看一下ShiroFilter的一些内容.


     二 . 配置内容解析

    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
            <property name="securityManager" ref="securityManager"></property>
            <!-- 配置登录页面 -->
            <property name="loginUrl" value="/login"></property>
            <!-- 配置未授权页面的路径 -->
            <property name="unauthorizedUrl" value="/unan.jsp"></property>
            <!-- 配置登录成功的页面 -->
            <property name="successUrl" value="/WEB-INF/success.jsp"></property>
            <!-- 配置过滤器链
                这是shiro的web配置的核心
             -->
             <property name="filterChainDefinitions">
                 <value>
                     /login=anon
                     /js/**=anon
                     /**=authc
                 </value>
             </property>
        </bean>

    我们在ShiroFilter之中配置了一个SecurityManager,也就是说ShiroFilter还是使用SecurityManager来完成整个shiro的运转流程.

    我们看到我们配置一个URL,这些URL是shiroFilter内置的一些配置信息.

    (1)loginUrl: 表示当shiroFilter发现用户没有认证过,自动跳转到该URl之中完成认证操作.

    (2)unauthorizedUrl : 表示shiro发现用户访问了一个自己无权限的资源的时候,就会将页面重定向到未授权页面.

    (3)successUrl : 表示用户登录成功之后重定向的页面,一般情况我们不使用这个配置.

    在shiroFilter之中,最为重要的就是filertChain这个概念了.

    shiro也是使用过滤链的方式完成操作的.

    配置的内容为 : url = 过滤器1,过滤器2 这样的模式.


    三 .ShiroFilter的结构

    我们看到上面的类继承结构,我们需要注意的是下面的几个过滤器.

    (1)NameableFilter: 名称过滤器,我们二部分的anon这样的名字就是通过这个过滤器完成的识别工作.

    (2)AccessControllerFilter : 访问控制过滤器,这个过滤器是我们以后自定义Filter需要继承的Filter.

    我们来看一下AccessControllerFilter这个类:

    我们只看需要重写的方法:

    public abstract class AccessControlFilter extends PathMatchingFilter {
      protected abstract boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception;
      protected abstract boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception;
    }

    我们来看一下上面的两个方法:

      (1)isAccessAllowed():这个方法是通过参数完成是否允许成功过滤的方法.

        前面拿到request和respones参数我们十分熟悉,只是最有的一个mappedValue参数我们不熟悉.

      看到这样的配置: /user=roles[admin] ,其中mappedValue就代表这个admin,其实就是一个String[].

      之所以是数组,就是代表可以有多个.

      该方法返回true,表示可以继续过滤.返回false,表示进入onAccessDenied()方法.

      (2)onAccessDenied()方法:当该过滤器不允许过滤的时候会进入该方法之中,我们可以从这个方法之中编写自己的逻辑.


    四 .内置过滤器

      在最上面我们编写了anon这样的内置过滤器,现在我们介绍一下常用的过滤器.

      (1)anno: 匿名方法,表示用户不需要任何认证(当然也不需要权限)就能进行访问.

      (2)authc : 表示需要经过认证才能进行访问.

      (3)roles: 表示用户需要拥有对应的角色才能访问

      (4)perms : 表示用户需要有对应的权限才能访问.

      下面我们来演示一下上面最常用的过滤器:

        /login=anon
        /authc=authc
       /user=roles[admin]
       /user/add=perms[admin:add]

    在上面我们配置了四类我们最为常用的过滤器:

    (1)anon 表示可以匿名访问

    (2)authc : 表示需要认证之后才能访问

    (3)roles:表示需要具有角色才能访问

    (4)perms:表示需要一定的权限才能访问.

    @RestController
    public class FilterController {
        
        @RequestMapping("/anon")
        public String anon() {
            return "anon";
        }
        
        @RequestMapping("/authc")
        public String authc() {
            return "authc";
        }
        
        @RequestMapping("/user")
        public String user() {
            return "user";
        }
        
        @RequestMapping("/user/add")
        public String userAdd() {
            return "user:add";
        }
        
        
    }

    我们编写对应的Controller.看是否能够实现URL拦截的方式.

    因为我们的URL都被配置需要一定的权限才能访问,现在我们的URL就被保护了.

  • 相关阅读:
    dlib库+vs2017详细配置流程
    【网易云课堂】【中科院团队】深度学习:算法到实战——神经网络基础
    【网易云课堂】【中科院团队】深度学习:算法到实战——绪论
    matlab 读取多行txt文本
    LeetCode 228. Summary Ranges【未加入列表】
    LeetCode 438. Find All Anagrams in a String
    c++冷知识
    python项目实战——西游记用字统计
    LeetCode 101. Symmetric Tree
    LeetCode 63. Unique Paths II
  • 原文地址:https://www.cnblogs.com/trekxu/p/9057975.html
Copyright © 2020-2023  润新知