在springboot中使用SHiro作为安全框架,非常简单,灵活性也比较高

在springboot中使用Shiro不用像官网教程那样,官网是将配置文件写在INI文件和XML配置中

springboot中提倡使用javaconfig的形式,所以这里都采用javaconfig的形式。

记录Shiro的初步使用(配置登录接口,认证成功的处理、认证失败的处理、无认证信息的处理)
进阶使用(使用缓存管理Shiro的Session和Cache)
完整版使用 (给出可在生产中使用的配置)

初步使用

  1. 自定义MyAuthorizingRealm类,继承类AuthorizingRealm,实现里面的doGetAuthorizationInfo和doGetAuthenticationInfo方法

AuthorizingRealm是Shiro提供的处理认证授权的抽象类,oGetAuthenticationInfo就是认证的处理,doGetAuthorizationInfo就是授权的处理。功能非常丰富。

  1. 自定义一个ShiroConfig类,对Shiro进行配置,主要是配置ShiroFilterFactoryBean,SecurityManager,DefaultWebSessionManager,AuthorizationAttributeSourceAdvisor

ShiroFilterFactoryBean,主要是配置某个Url的权限情况

DefaultWebSessionManager:对session进行管理,如命名、有效期等此处的Session是经过Shiro封装的session,扩展了相关属性。

AuthorizationAttributeSourceAdvisor:配置基于aop形式的授权校验,可在接口上通过注解添加权限处理

  1. 编写登录接口

    使用Shiro提供的Subject对象,调用其login方法,即可完成登录。

登录时会调用之前在MyAuthorizingRealm类定义的doGetAuthenticationInfo的认证逻辑(获取身份信息、密码加盐加密等),这其中还会涉及一些缓存的操作,暂时按下不表。

如何自定义Shiro的Filter?

Shiro已经提供了很多实现好的过滤器,可参考org.apache.shiro.web.filter.mgt.DefaultFilter枚举类,里面有实现类和简写的映射关系。

常用的如 anon(AnonymousFilter.class),authc(FormAuthenticationFilter.class),logout(LogoutFilter.class)等。

实现:

  1. 自定义类CustomFormAuthenticationFilter extends FormAuthenticationFilter
  2. 注册CustomFormAuthenticationFilter到shiroFilterFactoryBean中

tips:CustomFormAuthenticationFilter在获取时,只能用构造器new出来,spring容器中无法自定注入该类

参考:

    /**
* 在此配置拦截器栈
*/
@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
System.out.println("init ShiroConfiguration.shirFilter()"); ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager); //注册自定义filter 命名为authc 覆盖默认FormAuthenticationFilter
Map<String, Filter> filterMap = shiroFilterFactoryBean.getFilters();
filterMap.put("authc2", new CustomFormAuthenticationFilter());
shiroFilterFactoryBean.setFilters(filterMap); //拦截器.
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
// 配置不会被拦截的链接 顺序判断 注意过滤器配置顺序 不能颠倒
//配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了,登出后跳转配置的loginUrl
filterChainDefinitionMap.put("/logout.do", "logout");
// 配置不会被拦截的链接 顺序判断
filterChainDefinitionMap.put("/druid/**", "anon");
filterChainDefinitionMap.put("/static/**", "anon");
// ajax方式的登录
filterChainDefinitionMap.put("/ajaxLogin.do", "anon");
// ajax方式的退出登录
filterChainDefinitionMap.put("/ajaxLogout.do", "anon");
filterChainDefinitionMap.put("/unauth.do", "anon");
filterChainDefinitionMap.put("/formLogin.do", "authc2");
filterChainDefinitionMap.put("/**", "authc");
// 表单登录地址 是指跳转到登录页的url 而不是指定登录接口
shiroFilterFactoryBean.setLoginUrl("/formLogin.do");
// 表单登录成功后的跳转地址
shiroFilterFactoryBean.setSuccessUrl("/loginSuccess.do");
// 请求未认证的跳转地址
shiroFilterFactoryBean.setUnauthorizedUrl("/unauth.do"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}

如何进行传统表单登录而不是ajax形式?

在config类中配置一个接口,并用authc(FormAuthenticationFilter.class)过滤器进行认证,即可走表单登录。

地雷

  1. ShiroFilterFactoryBean配置的地址坑很多
shiroFilterFactoryBean.setLoginUrl("/formLogin.do");
// 表单登录成功后的跳转地址
shiroFilterFactoryBean.setSuccessUrl("/loginSuccess.do");
// 请求未认证的跳转地址
shiroFilterFactoryBean.setUnauthorizedUrl("/unauth.do");

LoginUrl配置的地址,是表单登录接口,但如果已经登录成功,再访问该接口重新登录,shiro并不会拦截到该接口,而是直接放行。springMVC会直接去寻找/formLogin.do接口,如果没有自定义该接口,就会报404

SuccessUrl是authc(FormAuthenticationFilter.class)处理登录成功后的跳转地址

UnauthorizedUrl是请求认证时发现无认证信息时,跳转的接口

  1. 配置可参考org.apache.shiro.spring.web.config包下的AbstractShiroWebConfiguration类,有一些参数配置文件的读取

代码参考地址

https://github.com/starmoon1994/shiro-collection

2521-Shiro系列-基本使用的更多相关文章

  1. Apache Shiro系列之五,概述 —— 配置

    Shiro设计的初衷就是可以运行于任何环境:无论是简单的命令行应用程序还是复杂的企业集群应用.由于运行环境的多样性,所以有多种配置机制可用于配置,本节我们将介绍Shiro内核支持的这几种配置机制.   ...

  2. Apache Shiro系列四,概述 —— Shiro的架构

    Shiro的设计目标就是让应用程序的安全管理更简单.更直观.     软件系统一般是基于用户故事来做设计.也就是我们会基于一个客户如何与这个软件系统交互来设计用户界面和服务接口.比如,你可能会说:“如 ...

  3. Apache Shiro系列三,概述 —— 10分钟入门

     一.介绍 看完这个10分钟入门之后,你就知道如何在你的应用程序中引入和使用Shiro.以后你再在自己的应用程序中使用Shiro,也应该可以在10分钟内搞定. 二.概述 关于Shiro的废话就不多说了 ...

  4. Apache Shiro系列一,概述 —— 初识

    一.什么是Shiro Apache Shiro是一个强大.灵活.开源的安全框架,它支持用户认证.权限控制.企业会话管理以及加密等. Apache Shiro的第一个也是最重要的一个目标就是易于使用和理 ...

  5. Apache Shiro系列(1)

    Apache Shiro是啥呢,安全框架. 360百科是这么描述的:        Apache Shiro(日语"堡垒(Castle)"的意思)是一个强大易用的Java安全框架, ...

  6. Apache Shiro系列二,概述 —— 基本概念

    做任何事情,首先要双方就一些概念的理解达成一致,这样大家就有共同语言,后续的沟通效率会高一些. #,Authentication,认证,也就是验证用户的身份,就是确定你是不是你,比如通过用户名.密码的 ...

  7. Apache Shiro系列教程之三:Shiro的结构

    Shiro的设计目标是简化应用的安全管理工作.软件通常是以用户为基础设计的.也就是说,我们经常是根据用户是怎样和我们的软件交互的来设计相关的用户接口.比如,你可能会说"如果是已经登录的用户与 ...

  8. Apache Shiro系列教程之二:十分钟上手Shiro

    在本教程中,我们会写一个简单的.仅仅输出一些内容命令行程序,从而对Shiro有一个大体的感觉. 一.准备工作 本教程需要Java1.5+,并且我们用Maven生成项目,当然Maven不是必须的,你也可 ...

  9. Shiro 系列: 简单命令行程序示例

    在本示例中, 使用 INI 文件来定义用户和角色. 首先学习一下 INI 文件的规范. =======================Shiro INI 的基本规范================== ...

  10. Shiro 系列 - 基本知识

    和 Spring Security 项目一样, Apache Shiro 也是一个被广泛使用安全框架, 它们都能完成认证.授权.会话管理等. 简单对比一下 Apache Shiro 和 Spring ...

随机推荐

  1. 聊聊 HTTPS

    聊聊 HTTPS 本文写于 2021 年 6 月 30 日 最近工作也是越来越忙了,不像上学的时候,一天下来闲着没事可以写两篇博客. 今天来聊一下 HTTPS. HTTP HTTP 是不安全的协议. ...

  2. 解决 youtube 片尾内容被遮挡

    参考: https://www.pcdvd.com.tw/showthread.php?t=1137333 在 ublock 的自定义静态规则中加上这句话 www.youtube.com##.ytp- ...

  3. 使用 VS Code + Markdown 编写 PDF 文档

    背景介绍 作为一个技术人员,基本都需要编写技术相关文档,而且大部分技术人员都应该掌握 markdown 这个技能,使用 markdown 来编写并生成 PDF 文档将会是一个不错的体验,以下就介绍下如 ...

  4. Springboot目录结构分析

    1 src/main/java 存储源码 2 src/main/resource 资源文件夹    (1)src/main/resource/static 用于存放静态资源,如css.js.图片.文件 ...

  5. veeambackup通过虚拟机还原系统文件操作说明

    如何从 VeeamBackup Replication 从备份中提取文件恢复到本地.当我们的服务器中误操作删除了一些文件特别是共享文件,文件被删除后往往都是几个小时或者几天后才被发现.特别是文件服务器 ...

  6. 一个恢复CSI挂载信息的解决方法

    一个恢复CSI挂载信息的解决方法 问题描述 之前有做过一个华为OBS 的CSI插件,其基本运作原理如下图所示.CSI插件Pod挂载了主机的/var/lib/kubelet/pods目录,当创建挂载Pv ...

  7. uniapp使用scroll-view与swiper组件实现tab滑动切换页面需要注意的问题

    效果图: tab栏可以滑动,切换页面跟随tab栏同步滑动.这里需要注意的是使用swiper组件时,它会有一个默认的高度,你必须动态的获取数据列表的高度覆盖原来的默认高度. 下面是代码 html < ...

  8. cve-2021-42287和cve-2021-42278漏洞复现

    一.漏洞概述 cve-2021-42287 : 由于Active Directory没有对域中计算机与服务器账号进行验证,经过身份验证的攻击 者利用该漏洞绕过完全限制,可将域中普通用户权限提升为域管理 ...

  9. 《The Tail At Scale》论文详解

    简介 用户体验与软件的流畅程度是呈正相关的,所以对于软件服务提供方来说,保持服务耗时在用户能接受的范围内就是一件必要的事情.但是在大型分布式系统上保持一个稳定的耗时又是一个很大的挑战,这篇文章解析的是 ...

  10. python实现人脸关键部位检测(附源码)

    人脸特征提取 本文主要使用dlib库中的人脸特征识别功能. dlib库使用68个特征点标注出人脸特征,通过对应序列的特征点,获得对应的脸部特征.下图展示了68个特征点.比如我们要提 取眼睛特征,获取3 ...