Apache Shrio安全框架实现原理及实例详解

一、Shiro整体概述

1.简介

Apache Shiro是Java的一个安全框架,功能强大,使用简单,Shiro为开发人员提供了一个直观而全面的认证(登录),授权(判断是否含有权限),加密(密码加密)及会话管理(Shiro内置Session)的解决方案.

2.Shiro组件

3.Shiro架构

3.1 外部架构(以应用程序角度)

3.2 内部架构

4. Shiro的过滤器


过滤器简称


对应的java类


anon


org.apache.shiro.web.filter.authc.AnonymousFilter


authc


org.apache.shiro.web.filter.authc.FormAuthenticationFilter


authcBasic


org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter


perms


org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter


port


org.apache.shiro.web.filter.authz.PortFilter


rest


org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter


roles


org.apache.shiro.web.filter.authz.RolesAuthorizationFilter


ssl


org.apache.shiro.web.filter.authz.SslFilter


user


org.apache.shiro.web.filter.authc.UserFilter


logout


org.apache.shiro.web.filter.authc.LogoutFilter

挑几个重要的说明一下:

anon:匿名过滤器,不登录也可以访问的资源使用,比如首页,一些静态资源等

authc:认证过滤器,登录成功后才能访问的资源使用

perms:授权过滤器,必须具备某种权限才能访问

roles:角色过滤器,必须具备某种角色才能访问

注意:这么多过滤器,使用起来肯定不方便,Shiro框架也考虑到了这一点,所以有一个过滤器,一个顶十个,即DelegatingFilterProxy.

5. Shiro与Spring整合

5.1 pom.xml

<!--shiro和spring整合-->
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-spring</artifactId>
      <version>1.3.2</version>
    </dependency>

5.2 web.xml

<filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
      <param-name>targetFilterLifecycle</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

5.3applicationContext-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:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
  <!--安全管理器,需要注入realm域,如果有缓存配置,还需要注入缓存管理器-->
  <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    <!--引用自定义的realm -->
    <property name="realm" ref="authRealm"/>
    <!--引入缓存管理器-->
    <property name="cacheManager" ref="cacheManager"/>
  </bean>

  <!-- 自定义Realm域的编写 -->
  <bean id="authRealm" class="com.itheima.web.shiro.AuthRealm">
    <!-- 注入自定义的密码比较器 -->
    <property name="credentialsMatcher" ref="customerCredentialsMatcher"></property>
  </bean>

  <!-- 自定义的密码比较器 -->
  <bean id="customerCredentialsMatcher" class="com.itheima.web.shiro.CustomCredentialsMatcher"></bean>

  <!--缓存配置-->
  <!--内置(windows)缓存配置:MemoryConstrainedCacheManager-->
  <bean id="cacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager"></bean>

  <!-- filter-name这个名字的值来自于web.xml中filter的名字 -->
  <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager"/>
    <!--登录页面 -->
    <property name="loginUrl" value="/login.jsp"></property>
    <!-- 登录失败后 -->
    <property name="unauthorizedUrl" value="/unauthorized.jsp"></property>

    <property name="filterChainDefinitions">
      <!-- /**代表下面的多级目录也过滤 -->
      <value>
        /system/module/list.do = perms["模块管理"]<!--路径和模块名称一定要和数据库表中存储的数据一致-->
        /index.jsp* = anon<!--anon 不登录也可以访问的资源-->
        /login.jsp* = anon
        /login* = anon
        /logout* = anon
        /css/** = anon
        /img/** = anon
        /plugins/** = anon
        /make/** = anon
        /** = authc
      </value>
    </property>
  </bean>

  <!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
  <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

  <!-- 生成代理,通过代理进行控制 -->
  <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
     depends-on="lifecycleBeanPostProcessor">
    <property name="proxyTargetClass" value="true"/>
  </bean>

  <!-- 安全管理器 -->
  <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    <property name="securityManager" ref="securityManager"/>
  </bean>

  <!--支持Shiro注解配置-->
  <aop:aspectj-autoproxy proxy-target-class="true"/>

</beans>

5.4 如果想看具体的实现代码(含sql脚本),可以点击页面右上角Fork me on github,到我的github仓库中拉取

仓库地址:  https://github.com/AdilCao/Shiro.git

代码部分只需要关注三个类:

1.LoginController(登录,在这里获取Subject主体,调用subject.login()方法后直接调用认证方法)

2.AuthRealm(认证和授权在这个类中定义,认证成功后调用密码比较器进行比较;授权即查找登录用户所具有的权限模块集合)

3.CustomCredentialsMatcher(密码比较器,将浏览器输入明文密码加密后,与数据库中的安全密码进行比较)

注意:整个过程中如果登录不成功,就会抛出异常

(0)

相关推荐

  • TP5框架实现上传多张图片的方法分析

    本文实例讲述了TP5框架实现上传多张图片的方法.分享给大家供大家参考,具体如下: 1.效果图(每点击一次'添加选项',就会有一个新的 file 框来添加新的图片) 2.view <!--不要忘了引入jquery文件--> <!-- post传值方式和文件传输协议一定要加上 --> <input type="file" name="image[]"> <input type="button" id=&quo

  • thinkphp5 框架结合plupload实现图片批量上传功能示例

    本文实例讲述了thinkphp5 框架结合plupload实现图片批量上传功能.分享给大家供大家参考,具体如下: 在extend目录下新增目录uploader,并新建类Uploads <?php namespace uploader; class Uploads { public static function upfile($file, $path = 'images', $add_domain = false) { $res = ['errno' => 1, 'errmsg' =>

  • yii框架结合charjs实现统计30天数据的方法

    本文实例讲述了yii框架结合charjs实现统计30天数据的方法.分享给大家供大家参考,具体如下: 理论上30天数据应该都有,但实际上却不一定是,所以需要补全 public static function getDayOrderCharData($days = 30) { $nowDay = date('Y-m-d', strtotime('-1day')); // 当前前一天 $lastDay = date("Y-m-d", strtotime('-'.$days.'day'));

  • yii框架结合charjs统计上一年与当前年数据的方法示例

    本文实例讲述了yii框架结合charjs统计上一年与当前年数据的方法.分享给大家供大家参考,具体如下: 理论上是1年有12个月,但实际上却是去年12个月已经过了,是完整的12个月,今年的12个月还没过,不完整,所以需要补齐 public static function getYearOrderCharData() { // 获取当前年 $months = range(1, 12); $currentYear = date('Y'); $lastYear = date('Y', strtotime

  • JAVA集合框架Map特性及实例解析

    一 Map特性: 1 Map提供一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value: 2 Map中键值对以Entry类型的对象实例形式存在: 3 键,即key不可重复,但是value值可以: 4 每个键最多只能映射一个值: 5 Map接口提供了分别返回key值集合.value值集合以及Entry(键值对)集合的方法: 6 Map支持泛型,形式如:Map<K,V> 二 HashMap类: 1 HashMap是Map的一个重要实现类,也是最常

  • Spring-boot结合Shrio实现JWT的方法

    本文介绍了Spring-boot结合Shrio实现JWT的方法,分享给大家,具体如下: 关于验证大致分为两个方面: 用户登录时的验证: 用户登录后每次访问时的权限认证 主要解决方法:使用自定义的Shiro Filter 项目搭建: 这是一个spring-boot 的web项目,不了解spring-boot的项目搭建,请google. pom.mx引入相关jar包 <!-- shiro 权限管理 --> <dependency> <groupId>org.apache.s

  • TP5框架实现一次选择多张图片并预览的方法示例

    本文实例讲述了TP5框架实现一次选择多张图片并预览的方法.分享给大家供大家参考,具体如下: 点击选择图片(可选多张),确定后将选择的图片显示在页面上,已经选择的图片也可以删除,点击提交将图片提交给后台. 1.效果图 2.code 用input标签并选择type=file,记得带上multiple,不然就只能单选图片了 如果不想通过 ajax 提交,一定要加上文件传输协议 ( enctype="multipart/form-data" ) view <!DOCTYPE html&g

  • Apache Shrio安全框架实现原理及实例详解

    一.Shiro整体概述 1.简介 Apache Shiro是Java的一个安全框架,功能强大,使用简单,Shiro为开发人员提供了一个直观而全面的认证(登录),授权(判断是否含有权限),加密(密码加密)及会话管理(Shiro内置Session)的解决方案. 2.Shiro组件 3.Shiro架构 3.1 外部架构(以应用程序角度) 3.2 内部架构 4. Shiro的过滤器 过滤器简称 对应的java类 anon org.apache.shiro.web.filter.authc.Anonymo

  • Apache Cordova Android原理应用实例详解

    目录 前言 技术选型 技术原理 1. 如何本地加载url对应的资源 2. webview如何使用js调用app原生api 3. app原生api如何回调webview中的js 4. 多个plugin的情况 关于踩到的坑 1. 打包路径配置问题 2. success不回调问题 前言 从原理到应用复盘一下自己做过的所有项目,希望能让我自己过两年仍然能看懂现在写的代码哈哈.在项目里我只负责了Android的开发包括插件开发和集成,ios没摸到,有机会也得自己玩下,但是这篇文章不会接触. 技术选型 现在

  • Spring IOC和aop的原理及实例详解

    这篇文章主要介绍了Spring IOC和aop的原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.特点是面向接口编程,松耦合. 1:IOC(控制反转) 别名(DI:依赖注入) 首先来一段ioc的实现原来代码: public class ClassPathXmlApplicationContext implements BeanFactory { privat

  • Python 异步协程函数原理及实例详解

    这篇文章主要介绍了Python 异步协程函数原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一. asyncio 1.python3.4开始引入标准库之中,内置对异步io的支持 2.asyncio本身是一个消息循环 3.步骤: (1)创建消息循环 (2)把协程导入 (3)关闭 4.举例: import threading # 引入异步io包 import asyncio # 使用协程 @ asyncio.coroutine def

  • SpringBoot Starter依赖原理与实例详解

    目录 1 Starter 2 了解 spring.factories机制 2.1 不同包路径下的依赖注入 2.2 spring.factories 机制 3 spring.factories 机制的实现源码分析 4 程序运行入口run() 1 Starter 在开发 SpringBoot 项目的时候,我们常常通过 Maven 导入自动各种依赖,其中很多依赖都是以 xxx-starter 命名的. 像这种 starter 依赖是怎么工作的呢? 2 了解 spring.factories机制 导入一

  • Redis 实现队列原理的实例详解

    Redis 实现队列原理的实例详解 场景说明: ·用于处理比较耗时的请求,例如批量发送邮件,如果直接在网页触发执行发送,程序会出现超时 ·高并发场景,当某个时刻请求瞬间增加时,可以把请求写入到队列,后台在去处理这些请求 ·抢购场景,先入先出的模式 命令: rpush + blpop 或 lpush + brpop rpush : 往列表右侧推入数据 blpop : 客户端阻塞直到队列有值输出 简单队列: simple.php $stmt = $pdo->prepare('select id, c

  • Vue.js框架路由使用方法实例详解

    Vue.js框架路由使用方法实例详解 html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name='viewport' content='width=device-width,initial-

  • java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解

    java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解 其实apache中的ant包(请自行GOOGLE之ant.jar)中有一个更好的类,已经支持中文了,我们就不重复制造轮子了,拿来用吧, 这里最主要的功能是实现了 可以指定多个文件 到同一个压缩包的功能 用org.apache.tools.zip压缩/解压缩zip文件的例子,用来解决中文乱码问题. 实例代码: import Java.io.BufferedInputStream; import java.io.

  • Java Linkedlist原理及实例详解

    这篇文章主要介绍了Java Linkedlist原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 定义:linkedlist属于链表结构,方便添加和删除元素,但查询不方便,适用于对收尾的操作. 具有具体的对象,使用对象调用具体的方法 add // 添加元素 //在中间添加元素 arr.add("H"); addFirst:在集合最前面添加元素 // 在链表头部添加元素 arr.addFirst("F")

  • Java8默认方法Default Methods原理及实例详解

    这篇文章主要介绍了Java8默认方法Default Methods原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Java 8 引入了新的语言特性--默认方法(Default Methods). Default methods enable new functionality to be added to the interfaces of libraries and ensure binary compatibility wit

随机推荐