shiro(java安全框架)

2023-10-26

640?wx_fmt=png

以下都是综合之前的人加上自己的一些小总结


Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。


Shiro 主要分为来个部分就是认证和授权,在个人感觉来看就是查询数据库做相应的判断而已,Shiro只是一个框架而已,其中的内容需要自己的去构建,前后是自己的,中间是Shiro帮我们去搭建和配置好的


个人认为需要看一下其中的一些源码,更有帮助的深入的去了解Shiro的原理。


Shiro的主要框架图如下:


640?wx_fmt=png


方法类的走向:


640?wx_fmt=png


对一些其中的方法的简单说明:


Subject


Subject即主体,外部应用与subject进行交互,subject记录了当前操作用户,将用户的概念理解为当前操作的主体,可能是一个通过浏览器请求的用户,也可能是一个运行的程序。 Subject在shiro中是一个接口,接口中定义了很多认证授相关的方法,外部程序通过subject进行认证授,而subject是通过SecurityManager安全管理器进行认证授权

SecurityManager


SecurityManager即安全管理器,对全部的subject进行安全管理,它是shiro的核心,负责对所有的subject进行安全管理。通过SecurityManager可以完成subject的认证、授权等,实质上SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理等。


SecurityManager是一个接口,继承了Authenticator, Authorizer, SessionManager这三个接口。


Authenticator


Authenticator即认证器,对用户身份进行认证,Authenticator是一个接口,shiro提供ModularRealmAuthenticator实现类,通过ModularRealmAuthenticator基本上可以满足大多数需求,也可以自定义认证器。


Authorizer


Authorizer即授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。


realm


Realm即领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据,比如:如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。


注意:不要把realm理解成只是从数据源取数据,在realm中还有认证授权校验的相关的代码。


sessionManager


sessionManager即会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录


SessionDAO


SessionDAO即会话dao,是对session会话操作的一套接口,比如要将session存储到数据库,可以通过jdbc将会话存储到数据库。


CacheManager


CacheManager即缓存管理,将用户权限数据存储在缓存,这样可以提高性能。


Cryptography


Cryptography即密码管理,shiro提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。


shiro认证与授权的在Web中实现



第一步:添加jar包


<!-- shiro -->
<dependency>
     <groupId>org.apache.shiro</groupId>
     <artifactId>shiro-core</artifactId>
     <version>1.4.0</version>
</dependency>
<dependency>
     <groupId>org.apache.shiro</groupId>
     <artifactId>shiro-spring</artifactId>
     <version>1.4.0</version>
</dependency>


第二步:配置web.xml


<!-- shiro 过滤器 start -->
 <filter>
   <filter-name>shiroFilter</filter-name>
   <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
   <!-- 设置true由servlet容器控制filter的生命周期 -->
   <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>
 <!-- shiro 过滤器 end -->


第三步:自定义Realm 

继承 AuthorizingRealm 

重写 AuthorizationInfo(授权) 

重写 AuthenticationInfo(认证)


以下只是简单的测试

以下都是根据个人的设置和需求改变的。现在数据是死的,运用的时候需要从数据库中得到


/**
@author zhouguanglin
@date 2018/2/26 14:05
*/

public class CustomRealm extends AuthorizingRealm {
   /**
    * 授权
    * @param principalCollection
    * @return
    */

   @Override
   protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
       String userName = (String) principalCollection.getPrimaryPrincipal();
       List<String> permissionList=new ArrayList<String>();
       permissionList.add("user:add");
       permissionList.add("user:delete");
       if (userName.equals("zhou")) {
           permissionList.add("user:query");
       }
       SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
       info.addStringPermissions(permissionList);
       info.addRole("admin");
       return info;
   }
   /**
    * 认证
    * @param authenticationToken
    * @return
    * @throws AuthenticationException
    */

   @Override
   protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
       String userName = (String) authenticationToken.getPrincipal();
       if ("".equals(userName)) {
           return  null;
       }
       SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(userName,"123456",this.getName());
       return info;
   }
}


第四步:配置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"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

   <!--开启shiro的注解-->
   <bean id="advisorAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
       <property name="proxyTargetClass" value="true"></property>
   </bean>
   <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"/>
   <!--注入自定义的Realm-->
   <bean id="customRealm" class="com.test.realm.CustomRealm"></bean>
   <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
       <property name="realm" ref="customRealm"></property>
   </bean>

   <!--配置ShiroFilter-->
   <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
       <property name="securityManager" ref="securityManager"></property>
       <!--登入页面-->
       <property name="loginUrl" value="/login.jsp"></property>
       <!--登入成功页面-->
       <property name="successUrl" value="/index.jsp"/>
       <property name="filters">
           <map>
               <!--退出过滤器-->
               <entry key="logout" value-ref="logoutFilter" />
           </map>
       </property>
       <!--URL的拦截-->
       <property name="filterChainDefinitions" >
           <value>
               /share = authc
               /logout = logout
           </value>
       </property>

   </bean>
   <!--自定义退出LogoutFilter-->
   <bean id="logoutFilter" class="com.test.filter.SystemLogoutFilter">
       <property name="redirectUrl" value="/login"/>
   </bean>
</beans>


一些属性的意义:


securityManager: 这个属性是必须的。


loginUrl: 没有登录的用户请求需要登录的页面时自动跳转到登录页面,不是必须的属性,不输入地址的话会自动寻找项目web项目的根目录下的”/login.jsp”页面。


successUrl: 登录成功默认跳转页面,不配置则跳转至”/”。如果登陆前点击的一个需要登录的页面,则在登录自动跳转到那个需要登录的页面。不跳转到此。


unauthorizedUrl: 没有权限默认跳转的页面。


Shiro中默认的过滤器


640?wx_fmt=png

在spring中直接引入<import resource="spring-shiro.xml"></import>


第五步:在spring-mvc.xml中配置权限的控制 异常的跳转


<!-- 未认证或未授权时跳转必须在springmvc里面配,spring-shiro里的shirofilter配不生效 -->
   <bean   class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
       <property name="exceptionMappings">
           <props>
               <!--表示捕获的异常 -->
               <prop key="org.apache.shiro.authz.UnauthorizedException">
                   <!--捕获该异常时跳转的路径 -->
                   /403
               </prop>
               <!--表示捕获的异常 -->
               <prop key="org.apache.shiro.authz.UnauthenticatedException">
                   <!--捕获该异常时跳转的路径 -->
                   /403
               </prop>
           </props>
       </property>
   </bean>


403是错误页面


第六步:在controller中测试使用的验证登入


@RequestMapping(value = "/login", method = RequestMethod.POST)
   public String login(String userName, String passwd, Model model) {
       Subject subject = SecurityUtils.getSubject();
       UsernamePasswordToken token = new UsernamePasswordToken(userName, passwd);
       try {
           subject.login(token);
       } catch (UnknownAccountException e) {
           e.printStackTrace();
           model.addAttribute("userName""用户名错误!");
           return "login";
       } catch (IncorrectCredentialsException e) {
           e.printStackTrace();
           model.addAttribute("passwd""密码错误");
           return "login";
       }
       return "index";
   }


之后的都是HTML页面的跳转


有关HTML中的一些shiro设置:


在使用Shiro标签库前,首先需要在JSP引入shiro标签: 


<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>


1、介绍Shiro的标签guest标签 :验证当前用户是否为“访客”,即未认证(包含未记住)的用户。


<shiro:guest> 

Hi there!  Please <a href="login.jsp">Login</a> or <a href="signup.jsp">Signup</a> today! 

</shiro:guest>


2、user标签 :认证通过或已记住的用户。


<shiro:user> 

Welcome back John!  Not John? Click <a href="login.jsp">here<a> to login. 

</shiro:user>


3、authenticated标签 :已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。


<shiro:authenticated> 

<a href="updateAccount.jsp">Update your contact information</a>

</shiro:authenticated>


4、notAuthenticated标签 :未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。 


<shiro:notAuthenticated> 

Please <a href="login.jsp">login</a> in order to update your credit card information. 

</shiro:notAuthenticated>


5、principal 标签 :输出当前用户信息,通常为登录帐号信息。  


Hello, <shiro:principal/>, how are you today?


6、hasRole标签 :验证当前用户是否属于该角色。  


<shiro:hasRole name="administrator"> 

<a href="admin.jsp">Administer the system</a> 

</shiro:hasRole>


7、lacksRole标签 :与hasRole标签逻辑相反,当用户不属于该角色时验证通过。  


<shiro:lacksRole name="administrator"

Sorry, you are not allowed to administer the system

</shiro:lacksRole>


8、hasAnyRole标签 :验证当前用户是否属于以下任意一个角色。   


<shiro:hasAnyRoles name="developer, project manager, administrator"> 

You are either a developer, project manager, or administrator. 

</shiro:lacksRole>


9、hasPermission标签 :验证当前用户是否拥有指定权限。  


<shiro:hasPermission name="user:create"> 

<a href="createUser.jsp">Create a new User</a> 

</shiro:hasPermission>


10、lacksPermission标签 :与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过。


<shiro:hasPermission name="user:create"> 

<a href="createUser.jsp">Create a new User</a> 

</shiro:hasPermission>


扩展阅读

SSM框架-实现分页和搜索分页

手写一个迷你版Spring MVC框架

为什么文件名要小写


来源:http://www.cnblogs.com/zhouguanglin/p/8477807.html

文章来源网络,版权归作者本人所有,如侵犯到原作者权益,请与我们联系删除

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shiro(java安全框架) 的相关文章

  • 单片机裸机环境下编写AT指令程序

    1 写在前面 AT指令在各种WIFI模块 2G 4G模块以及一些无线通讯模块中应用广泛 但是用过的朋友都知道 这种方式对于单片机编程来说 并不友好 本篇文章将以ESP8266 WIFI模块为例介绍在单片机裸机环境下编写AT指令程序的一种方式
  • 高精地图在无人驾驶中的应用

    转自 http 36kr com p 5060994 html 编者按 本文来自 程序员 作者 陈辰 刘少山 36氪经授权发布 高精地图是无人驾驶核心技术之一 精准的地图对无人车定位 导航与控制 以及安全至关重要 本文是 无人驾驶技术系列
  • PHP操作Redis LIST ,SET, HASH 的相关命令 (一)

    博客搬家 请访问 PHP操作Redis LIST SET HASH 的相关命令 一 PHP操作Redis KEY String 的相关命令 二 PHP操作Redis 有序集 Sorted Set 的相关命令 三
  • HttpServletRequest.getServletContext()一直提示找不到,而引出的问题

    开发j2ee项目的时候 需要用到servlet api 如果使用了maven web项目可以在pom xml中手动加入所需jar包 达到与依赖j2ee libarary同样的功能 可问题来了 1 问题描述 最近使用myeclipse10 7
  • 2023华为OD机试真题【打印机队列/排序】

    题目内容 有5台打印机打印文件 每台打印机有自己的待打印队列 因为打印的文件内容有轻重缓急之分 所以队列中的文件有1 10不同的代先级 其中数字越大优先级越高 打印机会从自己的待打印队列中选择优先级最高的文件来打印 如果存在两个优先级一样的
  • Struts框架(一)——简介

    引言 Struts 一个web应框架 概述 Struts基于MVC的一个web开源框架 也是一个表示层的框架 只能用于Web项目 内容 一 优缺点 1 优点 1 这是一个开源框架 能让开发人员更深入的了解其内部实现机制和原理 2 框架自带的
  • Spring之AOP的实现

    文章目录 什么是AOP jdk动态代理实现AOP spring实现AOP 什么是AOP AOP Aspect Oriented Programming 意为面向切面编程 我们所熟悉的是面向对象编程 OOP 将程序中所有参与模块都抽象成对象
  • vue2、3复习02-组件的生命周期,父子组件、兄弟组件、后代之间组件的数据共享,vuex,全局配置axious,使用ref引用dom元素,使用ref引用组件的方法,this.$nextTick

    1 组件的运行过程 声明周期函数 略 2 父子组件中的数据共享 父向子共享数据 子向父共享数据 父子之间双向数据同步 1 父组件向子组件共享数据 父组件通过v bind属性想子组件共享数据 子组件使用props接收数据 2 子组件向父组件共
  • 【C++】字体文件解析(FreeType)

    目录 字体文件解析 一 前言 二 基本排版概念 1 字体文件 2 字符图像和字符表 3 字符和字体指标 三 字形轮廓 四 字形指标 1 基线 笔和布局 2 排版指标和边界框 3 方位与步进 4 网格拟合的效果 5 文本宽度与边界框 五 代码
  • ipad怎么修改服务器,ipad怎么设置ipv6网络

    ipad怎么设置ipv6网络 内容精选 换一换 本文将为您介绍如何快速搭建IPv4网段或IPv6网段的VPC 以及搭建前的准备工作 IPv4 创建VPC及子网时 默认创建的网段为IPv4类型 IPv4网络无法访问Internet上的IPv6
  • 计算机组成原理实验四 微程序控制器实验报告

    我班算是几乎最后一个做实验的班级了 报告参考了一些朋友提供的数据加上一些自己的主观拙见 本人水平有限加之制作仓促难免有错误 望大家批评指正 4 1 微程序控制器实验 一 实验目的 1 掌握微程序控制器的组成原理 2 掌握微程序的编制 写入
  • 关于安装MinGw的问题

    前段时间电脑很卡 重装了系统 换了两条内存 电脑瞬间满血复活 不过重装各种东西就很麻烦了 安装个MinGW搞了我半天 所以今天记录一下怎么安装MinGW 1 哪下 MinGW w64GCC for Windows 64 32 bitshtt
  • Linux下配置java环境版本opencv

    安装gcc等编译环境 yum install gcc yum install python3 8 yum install cmake yum groupinstall Development Tools 去官方网站下载使用的压缩包4 5 0
  • nerf训练自己的数据,过程记录十分详细

    之前跑很多项目没有记录 后来再弄就不行了 这次特别记录一下 在梳理流程的同时希望给大家带来小小的帮助 我自己是在cuda11 2 windows环境下成功的 过程十分详细 有需要的朋友耐心看完 有问题可以评论区交流 首先 本文nerf是基于
  • Ubuntu 查看系统资源占用(CPU、内存、网络)

    系统监视器 CPU 内存 网络图 仅限当前桌面登录用户 gnome system monitor 查看内存占用 free h w 主要参数 b k m 分别以字节 KB MB 为单位显示内存使用情况 h 以合适的单位显示内存使用情况 最大为
  • SpringBoot+easypoi+vue导出word文档

    因为项目需求需要 临时写的有什么错误的地方望各位见谅 可以借鉴参考 easypoi依赖包
  • 在 Kylin 中实现异常值检测 UD(A)F

    本文讲解了时间序列数据异常值检测的基本概念和在 Kylin 中开发使用异常值检测 UDF 的方法 可以作为其他 UDF 开发的参考 通过在 Kylin 中移植 Hivemall 的 UDF 我们可以充分利用 Kylin 的优势 减少直接使用
  • TrafficMonitor安装报错

    由于找不到VCRUNTIME140 dll 无法继续执行代码 重新安装程序可能会解决次问题 解决方法 安装完 Visual Studio 2019后 就可以安装上了
  • STM32——一文完全读懂IIC通信

    文章目录 I2C基本概念 硬件线路 通信结构 I2C设备地址 I2C数据传输 I2C时钟速度和通信速度 I2C应答机制 I2C设备之间的冲突检测 I2C设备规格 主机读取数据 IIC通信过程 实际编程和应用 IO 口模拟 IIC 总线 常见
  • 服务器常用命令

    服务器常用命令 1 查看安装的软件 ps ef grep nginx 2 端口被占用 netstat anp grep 8801 2 2 通过程序名查询进程号 ps aux grep 程序名 2 3 通过进程号查询进程详细信息 ps ef

随机推荐

  • 【js】Object的常用方法

    Object assign target source 查看 Object entries 返回一个键值对数组查看 Object prototype toString call 查看
  • Redis的内存淘汰机制和删除策略

    Redis内存淘汰机制 Redis内存淘汰指的是用户存储的一些键被可以被Redis主动地从实例中删除 内存的淘汰机制的初衷是为了更好地使用内存 配置 我们可以通过配置redis conf中的maxmemory这个值来开启内存淘汰功能 这个值
  • 【Python函数】——sort,sorted

    1 sorted和sort的常规使用 2 关于自定义比较函数 3 试验 from functools import cmp to key ll 2 3 10 1 2 3 5 6 7 2 5 10 2 4 10 根据一个维度进行排序 这里根据
  • sqli-labs Less-25、25a(sqli-labs闯关指南 25、25a)

    目录 Less 25 Less 25a Less 25 GET 基于错误 您所有的OR AND都属于我们 字符串单引号 源码 本关主要将 or and 进行了大小写的过滤 将其换成空 如何绕过 or 和 and 过滤 一般性提供以下几种思路
  • 国内第一篇讲解减少卡顿的代码级详细文章

    原文链接 原文链接 系统网站应用出现过卡顿 但却不知道如何优化 国内第一篇讲如何减少卡顿的代码级别详细文章 也是性能优化系列文章中的一篇 欢迎点赞 关注 也欢迎对其中的内容进行评论 经常听人说 不要阻塞主线程 或者 减少长耗时 该如何做呢
  • SQL Server 数据分页查询

    最近学习了一下SQL的分页查询 总结了以下几种方法 首先建立了一个表 随意插入的一些测试数据 表结构和数据如下图 现在假设我们要做的是每页5条数据 而现在我们要取第三页的数据 数据太少 就每页5条了 方法一 select top 5 fro
  • 火星数字

    火星人是以 13 进制计数的 地球人的 0 被火星人称为 tret 地球人数字 1 到 12 的火星文分别为 jan feb mar apr may jun jly aug sep oct nov dec 火星人将进位以后的 12 个高位数
  • attr 'explicit_paddings',tensorflow迁移到安卓报错不能载入模型

    attr explicit paddings tensorflow迁移到安卓报错不能载入模型 Android Stdio中报错 Caused by java io IOException Not a valid TensorFlow Gra
  • 第十章 网络工具--基于Linux3.10

    在测试io设备时 常常会用到iostat iotop工具 在查看内存时常常用到vmstat free slabtop工具 在查看调度器时 常常使用mpstat top以及ps工具 这里来说说网络相关的工具 有性能分析 网络管理 状态查看类工
  • App逆向案例 X嘟牛 - Frida监听 & WT-JS工具还原(一)

    App逆向案例 X嘟牛 Frida监听 WT JS工具还原 一 提示 文章仅供参考 禁止用于非法途径 文章目录 App逆向案例 X嘟牛 Frida监听 WT JS工具还原 一 前言 一 资源推荐 二 App抓包分析 三 反编译逆向分析 四
  • 2023华为产品测评官-开发者之声

    2023华为产品测评官 开发者之声 活动激发了众多开发者和技术爱好者的热情 他们纷纷递交了精心编写的产品测评报告 活动社群充满活力 参与者们热衷于交流讨论 互相帮助解决问题 一起探索云技术的无限可能 在此次活动中 华为云CodeArts获得
  • 守护线程

    守护线程是一类比较特殊的线程 一般用于处理后台的工作 比如JDK的垃圾回收线程 守护线程具备自动结束生命周期的特点 非守护线程不具备这样的特点 首先明确一个问题 JVM什么情况下会退出 The java virtual machine ex
  • 关于H.248的树图规则

    一 H248数图 数图可以是一个字符串 我们不妨称之为数图字符串 它遵循了Unix系统命令中的规则表达式的语法规定 也可以是许多数图字符串的并集 之间用 分隔 我们不妨称之为数图字符串列表 以下是一个数图的例子 2 8 xxxxxxx 13
  • RabbitMQ 与 Kafka 对比

    作为一个有丰富经验的微服务系统架构师 经常有人问我 应该选择RabbitMQ还是Kafka 基于某些原因 许多开发者会把这两种技术当做等价的来看待 的确 在一些案例场景下选择RabbitMQ还是Kafka没什么差别 但是这两种技术在底层实现
  • 【jackson】自定义字段注解完成序列化逻辑

    目录 背景 本文开发环境介绍 新建一个注解 新建一个JavaBean 新建一个JsonSerializer 新建一个AnnotationIntrospector 单元测试 总结 背景 Spring默认的JSON序列化工具使用的是jackso
  • 基于CNN-LSTM数据分类:Matlab实现

    基于CNN LSTM数据分类 Matlab实现 在当今的信息时代 数据处理和分类已经成为了不可或缺的技能和工具 其中卷积神经网络 Convolutional Neural Network CNN 和长短时记忆网络 Long Short Te
  • 多少存款才是裸辞的最好姿态?

    朋友小惠上个月裸辞了 前几天见她还意气风发 没想到昨晚就和我说 焦虑来得远比想象中快 她的计划是三个月内找到满意的新工作 满打满算攒了三个月的生活费才踏出裸辞这一步 结果面试了几个公司后 对于能否在三个月内找到满意工作感到极度地焦虑 小惠认
  • [SWPUCTF 2021 新生赛]finalrce

  • tplink 703n lede -17.01 编译过程

    tplink 703n lede 17 01 编译过程 tplink 703n lede 17 01 编译过程 tplink 703n 支持USB扩展 利用其功能可实现挂载硬盘 打印机共享等 网上虽然有些现成的固件 但基于openwrt 1
  • shiro(java安全框架)

    以下都是综合之前的人加上自己的一些小总结 Apache Shiro是一个强大且易用的Java安全框架 执行身份验证 授权 密码学和会话管理 使用Shiro的易于理解的API 您可以快速 轻松地获得任何应用程序 从最小的移动应用程序到最大的网