shiro框架一 :基于URL粗粒度的页面拦截过滤

对于shiro大家都不陌生,它是一个权限控制框架。
它对权限控制,主要分为两种方式。
1、粗粒度URL级别的权限控制
2、细粒度基于方法的权限控制

其实权限控制的话,也可以自己写,主要用到的技术有
自定义实现:实现权限控制, 可以自己写代码实现 (粗粒度权限控制 Filter、 细粒度权限控制 自 定义注解、代理、反射技术),博主能力有限就不自己写了,,,(其实是写不出来,,,)。还有一个SpringSecurity框架也很不错,大家可以了解一下
下面就来分别说一说这两种权限控制。

一:粗粒度的基于URL级别的权限控制

可以基于 Filter 实现
在数据库中存放 用户、权限、访问 URL 对应关系,页面访问一个URL地址,即 当前用户访问一个 URL 地址,查询数据库判断用户当前具有权限,是否包含这个 URL,如果包含允许访问,如果不包含 权限不足 ,如果用户对应权限列表中存在URL地址,则允许访问!!!
注意:这种所谓URL的权限控制,在访问URL的时候只会访问一次(即在本次访问中你只访问一次),即进行一次权限控制,而细粒度的权限访问,是基于方法的,它会在你一次访问中调用服务器的多个方法,也就是说它会在一个方法中调用多个方法,所以他可以进行多次方法控制(即:在一个代理对象方法中,调用多个权限控制方法,进行多次权限控制),所以它相比URL的权限控制更为的精细
如下代码

二:细粒度基于方法实现的权限控制
可以代理、自定义注解实现, 访问目标对象方法,在方法上添加权限注解信息,对目 标对象创建代理对象,访问真实对象先访问代理对象,在代理对象查询数据库判断是否具有 注解上描述需要权限,具有权限 允许访问,不具有权限,拦截访问,提示权限不足

这里写图片描述

3:shiro的体系结构
1、 Authentication 认证 —- 用户登录,身份识别 who are you?
2、 Authorization 授权 — 用户具有哪些权限、角色 what can you do ? 3、 Cryptography 安全数据加密
4、 Session Management 会话管理
5、 Web Integration web 系统集成
6、 Interations 集成其它应用,spring、缓存框架
如下图所示
这里写图片描述
3.1 shiro运行的主要流程
ApplicationCode 用户编写代码
Subject 就是 shiro 管理的用户
SecurityManager 安全管理器,是 shiro 权限控制核心对象, 在编程时,只需要操作
Subject 方法, 底层调用 SecurityManager 方法,无需直接编程操作 SecurityManager
Realm 应用程序和安全数据之间连接器 ,应用程序 进行权限控制读取安全数据(数据 表、文件、网路 … ),通过 Realm 对象完成

登录流程: 应用程序 — Subject — SecurityManager — Realm — 安全数据

好了理论先说这么写,下面上代码
首先得有一个项目吧,我的是一个ssm框架

第1步:
引入shiro的jar包,为了省事,我这里引入了shiro的全部jar包

<dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-all</artifactId>
            <version>1.3.2</version>
        </dependency>

第2步:在web.xml中配置shiro

 <!--shiro的Filter-->
  <!--也就是说,在spring中就得有一个id为shiroFilter的bean-->
<filter>
  <filter-name>shiroFilter</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
  <filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern><!--这里配置/*:即为拦截所有的资源-->
  </filter-mapping>

web.xml中引入shiro配置文件,如果不引入,可能会报No bean named ‘shiroFilter’ is defined的异常

<context-param>
    <param-name>contextConfigLocation</param-name>
    <!--<param-value>classpath:spring-mybatis.xml spring-service.xml</param-value>-->
    <!-- <param-value>classpath:spring-*.xml</param-value>-->
    <param-value>classpath:spring-mybatis.xml,
                    classpath:spring-shiro.xml,
    </param-value>
  </context-param>

第3步:在spring-springmvc.xml文件中,引入spring-shiro.xml配置文件
注:因为我是重新搭建了一个ssm。东西比较少,没有把spring文件整合springmvc和shiro、mybatis分开,所以spring的一些相关整合我直接写在了spring-springmvc.xml文件中了

 <!--引入shiro权限配置-->
    <import resource="spring-shiro.xml"></import>

第4步:编写spring-shiro.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-4.0.xsd
                            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
                         ">

    <!-- 配置Shiro核心Filter  -->
    <bean id="shiroFilter"
          class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- 安全管理器 -->
        <property name="securityManager" ref="securityManager" />
        <!-- 未认证,跳转到哪个页面  -->
        <property name="loginUrl" value="/login.html" />
        <!-- 登录页面页面 -->
        <property name="successUrl" value="/index.html" />
        <!-- 认证后,没有权限跳转页面 -->
        <property name="unauthorizedUrl" value="/unauthorized.html" />
        <!-- shiro URL控制过滤器规则  -->
        <!--这里配置过后,所有的请求都经过shiro,然后也只有一下配置了,不登录可以问的才能访问,其他(/**)的都需要登录后才能访问-->
        <property name="filterChainDefinitions">
            <value>
                /login.html* = anon   <!--*表示访问页面的同时,允许传递参数-->
                /css/** = anon     <!--两个**表示该文件夹以及该文件夹下的所有子文件夹 -->
                /js/** = anon
                /images/** = anon
                /services/** = anon
              <!--  /pages/base/courier.html* = perms[courier:list]
                /pages/base/area.html* = roles[base]-->
                /** = authc    <!--登录后才能访问-->
            </value>
            <!--
            anon  未认证可以访问
            authc  认证后可以访问
            perms 需要特定权限才能访问
            roles 需要特定角色才能访问
            user 需要特定用户才能访问
            port  需要特定端口才能访问
            reset  根据指定 HTTP 请求访问才能访问
            -->
        </property>
    </bean>

<!--安全管理器-->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    </bean>

    <!--shiro后处理器-->
    <bean id="lifecycleBeanPostProcessor"
          class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
</beans>

更多有关shiro的过滤器配置如下图所示
这里写图片描述

ok,下面可以运行我们的项目了,我们想要的结果是,无论我们访问哪个页面,如果未登录(其实这里没有写登录,但是这效果是有的),它就只能访问我们授权的那个页面,即login.html。
运行结果如下所示
这里写图片描述

项目中还有其他页面
这里写图片描述
那么我在地址栏中输入http://localhost:9600/index.jsp
还是会跳转到login.htmlz页面(因为index.jsp未经授权不能访问)

注意:在运行的时候遇见了一个bug:No bean named ‘shiroFilter’ is defined
jar添加了,web.xml的过滤我配置了,spring的引入文件我也引入了,。。。怎么会说没有找到该类呢。
后来才发现,还需要在web.xml文件中引入spring-shiro.xml的配置文件。
标签的意思是初始化启动了.表示找到sprign的配置文件并加载上

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值