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也是使用过滤链的方式完成操作的.

扫描二维码关注公众号,回复: 925482 查看本文章

配置的内容为 : 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就被保护了.

猜你喜欢

转载自www.cnblogs.com/trekxu/p/9057975.html
008